<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive BOM for KiCAD</title>
  <style type="text/css">
:root {
  --pcb-edge-color: black;
  --pad-color: #878787;
  --pad-hole-color: #CCCCCC;
  --pad-color-highlight: #D04040;
  --pad-color-highlight-both: #D0D040;
  --pad-color-highlight-marked: #44a344;
  --pin1-outline-color: #ffb629;
  --pin1-outline-color-highlight: #ffb629;
  --pin1-outline-color-highlight-both: #fcbb39;
  --pin1-outline-color-highlight-marked: #fdbe41;
  --silkscreen-edge-color: #aa4;
  --silkscreen-polygon-color: #4aa;
  --silkscreen-text-color: #4aa;
  --fabrication-edge-color: #907651;
  --fabrication-polygon-color: #907651;
  --fabrication-text-color: #a27c24;
  --track-color: #def5f1;
  --track-color-highlight: #D04040;
  --zone-color: #def5f1;
  --zone-color-highlight: #d0404080;
}

html,
body {
  margin: 0px;
  height: 100%;
  font-family: Verdana, sans-serif;
}

.dark.topmostdiv {
  --pcb-edge-color: #eee;
  --pad-color: #808080;
  --pin1-outline-color: #ffa800;
  --pin1-outline-color-highlight: #ccff00;
  --track-color: #42524f;
  --zone-color: #42524f;
  background-color: #252c30;
  color: #eee;
}

button {
  background-color: #eee;
  border: 1px solid #888;
  color: black;
  height: 44px;
  width: 44px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 14px;
  font-weight: bolder;
}

.dark button {
  /* This will be inverted */
  background-color: #c3b7b5;
}

button.depressed {
  background-color: #0a0;
  color: white;
}

.dark button.depressed {
  /* This will be inverted */
  background-color: #b3b;
}

button:focus {
  outline: 0;
}

button#tb-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#lr-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#bom-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-grouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-ungrouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-netlist-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}

button#copy {
  background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
  background-position: 6px 6px;
  background-repeat: no-repeat;
  background-size: 26px 26px;
  border-radius: 6px;
  height: 40px;
  width: 40px;
  margin: 10px 5px;
}

button#copy:active {
  box-shadow: inset 0px 0px 5px #6c6c6c;
}

textarea.clipboard-temp {
  position: fixed;
  top: 0;
  left: 0;
  width: 2em;
  height: 2em;
  padding: 0;
  border: None;
  outline: None;
  box-shadow: None;
  background: transparent;
}

.left-most-button {
  border-right: 0;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

.middle-button {
  border-right: 0;
}

.right-most-button {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}

.button-container {
  font-size: 0;
  margin: 10px 10px 10px 0px;
}

.dark .button-container {
  filter: invert(1);
}

.button-container button {
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

@media print {
  .hideonprint {
    display: none;
  }
}

canvas {
  cursor: crosshair;
}

canvas:active {
  cursor: grabbing;
}

.fileinfo {
  width: 100%;
  max-width: 1000px;
  border: none;
  padding: 5px;
}

.fileinfo .title {
  font-size: 20pt;
  font-weight: bold;
}

.fileinfo td {
  overflow: hidden;
  white-space: nowrap;
  max-width: 1px;
  width: 50%;
  text-overflow: ellipsis;
}

.bom {
  border-collapse: collapse;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 10pt;
  table-layout: fixed;
  width: 100%;
  margin-top: 1px;
  position: relative;
}

.bom th,
.bom td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

.dark .bom th,
.dark .bom td {
  border: 1px solid #777;
}

.bom th {
  background-color: #CCCCCC;
  background-clip: padding-box;
}

.dark .bom th {
  background-color: #3b4749;
}

.bom tr.highlighted:nth-child(n) {
  background-color: #cfc;
}

.dark .bom tr.highlighted:nth-child(n) {
  background-color: #226022;
}

.bom tr:nth-child(even) {
  background-color: #f2f2f2;
}

.dark .bom tr:nth-child(even) {
  background-color: #313b40;
}

.bom tr.checked {
  color: #1cb53d;
}

.dark .bom tr.checked {
  color: #2cce54;
}

.bom tr {
  transition: background-color 0.2s;
}

.bom .numCol {
  width: 30px;
}

.bom .value {
  width: 15%;
}

.bom .quantity {
  width: 65px;
}

.bom th .sortmark {
  position: absolute;
  right: 1px;
  top: 1px;
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #221 transparent;
  transform-origin: 50% 85%;
  transition: opacity 0.2s, transform 0.4s;
}

.dark .bom th .sortmark {
  filter: invert(1);
}

.bom th .sortmark.none {
  opacity: 0;
}

.bom th .sortmark.desc {
  transform: rotate(180deg);
}

.bom th:hover .sortmark.none {
  opacity: 0.5;
}

.bom .bom-checkbox {
  width: 30px;
  position: relative;
  user-select: none;
  -moz-user-select: none;
}

.bom .bom-checkbox:before {
  content: "";
  position: absolute;
  border-width: 15px;
  border-style: solid;
  border-color: #51829f transparent transparent transparent;
  visibility: hidden;
  top: -15px;
}

.bom .bom-checkbox:after {
  content: "Double click to set/unset all";
  position: absolute;
  color: white;
  top: -35px;
  left: -26px;
  background: #51829f;
  padding: 5px 15px;
  border-radius: 8px;
  white-space: nowrap;
  visibility: hidden;
}

.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
  visibility: visible;
  transition: visibility 0.2s linear 1s;
}

.split {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: inherit;
}

.split.split-horizontal,
.gutter.gutter-horizontal {
  height: 100%;
  float: left;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
  transition: background-color 0.3s;
}

.dark .gutter {
  background-color: #777;
}

.gutter.gutter-horizontal {
  background-image: url('');
  cursor: ew-resize;
  width: 5px;
}

.gutter.gutter-vertical {
  background-image: url('');
  cursor: ns-resize;
  height: 5px;
}

.searchbox {
  float: left;
  height: 40px;
  margin: 10px 5px;
  padding: 12px 32px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 18px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 6px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  background-image: url('');
  background-position: 10px 10px;
  background-repeat: no-repeat;
}

.dark .searchbox {
  background-color: #111;
  color: #eee;
}

.searchbox::placeholder {
  color: #ccc;
}

.dark .searchbox::placeholder {
  color: #666;
}

.filter {
  width: calc(60% - 64px);
}

.reflookup {
  width: calc(40% - 10px);
}

input[type=text]:focus {
  background-color: white;
  border: 1px solid #333;
}

.dark input[type=text]:focus {
  background-color: #333;
  border: 1px solid #ccc;
}

mark.highlight {
  background-color: #5050ff;
  color: #fff;
  padding: 2px;
  border-radius: 6px;
}

.dark mark.highlight {
  background-color: #76a6da;
  color: #111;
}

.menubtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
  background-position: center;
  background-repeat: no-repeat;
}

.statsbtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.iobtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.visbtn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
  padding: 15px;
}

#vismenu-content {
  left: 0px;
  font-family: Verdana, sans-serif;
}

.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
  filter: invert(1);
}

.flexbox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.savebtn {
  background-color: #d6d6d6;
  width: auto;
  height: 30px;
  flex-grow: 1;
  margin: 5px;
  border-radius: 4px;
}

.savebtn:active {
  background-color: #0a0;
  color: white;
}

.dark .savebtn:active {
  /* This will be inverted */
  background-color: #b3b;
}

.stats {
  border-collapse: collapse;
  font-size: 12pt;
  table-layout: fixed;
  width: 100%;
  min-width: 450px;
}

.dark .stats td {
  border: 1px solid #bbb;
}

.stats td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

#checkbox-stats div {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

#checkbox-stats .bar {
  background-color: rgba(28, 251, 0, 0.6);
}

.menu {
  position: relative;
  display: inline-block;
  margin: 10px 10px 10px 0px;
}

.menu-content {
  font-size: 12pt !important;
  text-align: left !important;
  font-weight: normal !important;
  display: none;
  position: absolute;
  background-color: white;
  right: 0;
  min-width: 300px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 100;
  padding: 8px;
}

.dark .menu-content {
  background-color: #111;
}

.menu:hover .menu-content {
  display: block;
}

.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
  background-color: #eee;
}

.menu-label {
  display: inline-block;
  padding: 8px;
  border: 1px solid #ccc;
  border-top: 0;
  width: calc(100% - 18px);
}

.menu-label-top {
  border-top: 1px solid #ccc;
}

.menu-textbox {
  float: left;
  height: 24px;
  margin: 10px 5px;
  padding: 5px 5px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 14px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 4px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  width: calc(100% - 10px);
}

.menu-textbox.invalid,
.dark .menu-textbox.invalid {
  color: red;
}

.dark .menu-textbox {
  background-color: #222;
  color: #eee;
}

.radio-container {
  margin: 4px;
}

.topmostdiv {
  width: 100%;
  height: 100%;
  background-color: white;
  transition: background-color 0.3s;
}

#top {
  height: 78px;
  border-bottom: 2px solid black;
}

.dark #top {
  border-bottom: 2px solid #ccc;
}

#dbg {
  display: block;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: #aaa;
}

::-webkit-scrollbar-thumb {
  background: #666;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  margin: 3px 0;
  padding: 0;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  border-radius: 3px;
}

.slider:hover {
  opacity: 1;
}

.slider:focus {
  outline: none;
}

.slider::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  width: 100%;
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
  border: none;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin-top: -4px;
}

.dark .slider::-webkit-slider-thumb {
  background: #3d3;
}

.slider::-moz-range-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
}

.slider::-moz-range-track {
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
}

.dark .slider::-moz-range-thumb {
  background: #3d3;
}

.slider::-ms-track {
  width: 100%;
  height: 8px;
  border-width: 3px 0;
  background: transparent;
  border-color: transparent;
  color: transparent;
  transition: opacity .2s;
}

.slider::-ms-fill-lower {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-fill-upper {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin: 0;
}

.shameless-plug {
  font-size: 0.8em;
  text-align: center;
  display: block;
}

a {
  color: #0278a4;
}

.dark a {
  color: #00b9fd;
}

#frontcanvas,
#backcanvas {
  touch-action: none;
}

.placeholder {
  border: 1px dashed #9f9fda !important;
  background-color: #edf2f7 !important;
}

.dragging {
  z-index: 999;
}

.dark .dragging>table>tbody>tr {
  background-color: #252c30;
}

.dark .placeholder {
  filter: invert(1);
}

.column-spacer {
  top: 0;
  left: 0;
  width: calc(100% - 4px);
  position: absolute;
  cursor: pointer;
  user-select: none;
  height: 100%;
}

.column-width-handle {
  top: 0;
  right: 0;
  width: 4px;
  position: absolute;
  cursor: col-resize;
  user-select: none;
  height: 100%;
}

.column-width-handle:hover {
  background-color: #4f99bd;
}

.help-link {
  border: 1px solid #0278a4;
  padding-inline: 0.3rem;
  border-radius: 3px;
  cursor: pointer;
}

.dark .help-link {
  border: 1px solid #00b9fd;
}


  </style>
  <script type="text/javascript" >
///////////////////////////////////////////////
/*
  Split.js - v1.3.5
  MIT License
  https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});

///////////////////////////////////////////////

///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////

///////////////////////////////////////////////
/*!
 * PEP v0.4.3 | https://github.com/jquery/PEP
 * Copyright jQuery Foundation and other contributors | http://jquery.org/license
 */
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});

///////////////////////////////////////////////

///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "F", "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////

///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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T3WnK7Z2yrhQxAzeRd8AwS86oUynbwThVctiVvIrZdbLICiadklCViDiNWDCekwIlbrnuCGkThvUepfogJpw20f+borsRrTAs9MFPwNzgsaisu3fAbLolEwy7JcD8u0/ImyJKuhEiuamZ1f+aM6DxjDkSz9E4s6tsJSJyXC4clcAuoZaczvSViM6tnkViuzFluroGqJjp28DauhWoxLntwQWKuFwqu2q7nB3G7Hy79rjxSAWoArsbid+wPqRlvQkKArvliUVDmZg7PXgIqwkxZIUiirqSukG5crvSXdK7HZkvY43FOUBRpIIc8rploCXATrvxrHzgSruSIKUJqrsCul0AYw2etGq7VSBPDZ61aGM+mdxZ2rp1kgq7xAW2icqhOrsepYxLBrsXYceae8DAjRmoR6ITs9MRJ51zg0qkzvQZqI66orthu3EDQrv6Wdq61rscWSoc552k4axZsbvKumq638CLDOedxRGGLRm6ehKGukG4kboaEmm6NYjiAdocrpO+yfG46rupqDm6ZTTEuU6TWvXVm2siWhK2uqkKDrr2nelD2sCpiDa7qhMluz6YcnmsjIG7Aro1u8ZMKbtliVV8MQKWup7IMsFMuwy6Ng2XnWW7DrP2HOKsdLs03GkohQMtutO9Bh2KE1bY8uINuiach6kofF9Rkgg8uplB2BP9y1RczbqMYTCMtF3K7LOZnbrGqUK7huLfySO7d7yL4qG7cbsPrIt1DpNFujwNKhzSui4czd3Tu8x5srt7rcuNObz/sYbj+bshtcG7bfRjugy6w7uNrdG7bbr19d26S7rx7TmtpIwLurzYeOG8KVW7c7rT9a26M7piwCdFJSgxu0FkHeL7us663mW1XGuMZbzju/Hc27sjuvA6eNT2Eiq7Y/QNu6cT57oLuYljA7rDuygzk4z2uyIyBrpJuie6HqnLusa7payPYVmpU7quqNy7u7o9QdSjmro7umWST7vyu0zAluAPuhq6KDPtPBmoa7vYMze737pXuzVNn7rzrPAxlpJauh+6IhIZEju7IqKGklG6It2YMQedMbq2qcEJNpziuraodB1ju03cBLOhqOa6UaxMjVuczbu/ut5Al7uweo1NUi3fusXY57rNutQaFo092uDq+6AXqktL0SlQpJnsoQJTEuW7IKDlNFhJCPGVur3sGHvMBTkL/ewYe/VA5bvylFG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HMSYaJg0mZSfLJgomkyaQJhUmwKb0JmSndfyRFYUnhcYqxxSmdSeUpobHKKexJ6inYAFop+wnWicYpvfHmKfvJ2smcrQ8Jl8nmyZXR76IKgKjKBkmQieAGsInhSYEJyImRyZiJnkmpKZLRuTBd3t8pjUmFKbFJt7hVyZUpwsm1KZQpw0n5ceNJ2+GdKZTJxUm+caUrQ97dalipkXHAScSpyympSfUpuAn8SYcJq3GqyecJugn08ftxy0mmCayAG0mfceKoTR5bwM9gLsnGSegGgSnwiYgUEKn4qayx8SmxCZwp+EnKoFnNGYIivGXiQqnTKcGp2omCyfqJ5CnVCdLJ+MmMKa0p5MnVcdGp8CnsYEBML2BWDTdKLAndcaKplcmEKYWppCmVCZxJ74A7KcqphyntiZoJ2qnOifNJ1ynQsY+EFqnfCe41anpmAkAQvymXSZ6pxFI/ycMRiIm2VHEx4CnhqdAprampyf5c9mB0ChVhman5CbMpiUmKKbKp1KmNKbWpzKmiiY7RnKnw2RMC/jhqgjxQeSnjqfippSnIydUppanLqZopvEmMqYYpu6mnCZcJ+qnuicapjwmbGDep04mfwChprXYIMK6p/ym/qeoEvqnhKZzJyiAhqd5hkanPic6RnGn7kjIAgmnZqcIx4mnICdJpi6mbKeupjKnR8ewp0WnxifZpthYsTClp+GmiafMpkmnkqbJpxWnKac0py3HKyfupummSSbcprgByceOJsYmtUfFppnVdJr4pgKneqaCpoGmRKcFp0GnhafBptWn7aY1pzBZKNm1ptIndacRps6mrKZjJtKmKCeVp+Unsqb0p7Gn/aaS/bi9DqaPBOKmZab1puWmDaYVp1CmrqeNptGnqaaYps0nXCeep5bG7pw4pu2niqG0YfIiTMC5p36neCcEp4KngadCpkCnYidTJuFH9BMtaDI0GACDp6om5qfRJpKnFqazpyOnLye8xlWndKYhp+ImGyT626unjKaqJ/XGodxKplfHQScHx3ImoSaoJ6qnzabqpy2mFEdXQFmmVkZjuUSFNxsdo52mGYc7hvqmlyeeJwjGxKe9plumsaZdR/enfQj2Wd+GiKbDJzLH5qYxJzOmqKezpimn0KaBx9GntCfHpu+mepDFRjbkZ6c1JgWnGUbfp/unzqc/poenV6fop28nqyZcp1imPCf8XMunbSb2SOJiUTkxk4+m66b5pwCmm6bBpm+m46a+JqKn/Kl9gbum56fogBemoyZSp5am0KdWp3+nR6djpgBmS0byp5y5ekIoZ4qnTqffpgemYGdRp3+n86acpwun6aYfJq2nK4abJt8m88cXsyU4d2KLx7sm/yEblF/HjKbfxyZGpL1fp+PGwqckp1umVka3YxtjZ8feRnAmY8AGxjOneGespr+nbKdzpxhmY6c2p32m/kl0Z1tjF5mAJ91lcCfAZ6DHqGflpvhmKqapphBmHqeJJhqnHydeAAAApCRnOKbURqQnnLgteD+AZiaTg+fEfYFvEV/G53AZAJxQvkaWeL2nuSa0Z2+nOkZYeAwnoOOD5YwmXICeJrhnyKbDp5GnyaYsZn+n8ib/p1Wm+SbYJ85xzLkiZ4TGCmdwJkimGsT7p0qn9SZKAI2mKmYtxmxmambUR65wf6lyZ52h8meogFyAimYspxemiye1AMpmlaZNpwRn2id8Zlin3CYJhv860GdapypbzqXgEy5sS1mPpjuG9EbdpjmHAMBBpjRnm6fCp7RmnkbLoeforqjG4FEnsybMJ9xmP6bMZ2Bm6KYQJ7SmMab9J2xmNmfF4fASjmGSJl7GX6e1J0OmeGegZp5n+GcqZ+ZmaqYtp/xmxGcJh9invCfLp8e0hJP4k1Vga6b2x24m3Sfrpx4nmmeXiOPHRyYip+uGjGHPIahJL2mMJpWG7mZOp4pngWfDp4snnmfspzCm3mf/pz5m57UvAIlnW7qfp/5nyWd7ph5nTGYjpsFmemZ8ZqFmGaYCZrgA+iZdxwYmSEdaIM/GQmYRZ1l5rwC9eYbQfqb2xmO5ZYXmJiLtaUd36QBpQCdWJlJmuXhOZwhnNiZpp5ymnqeQZgmHS6fhZ9BnWXg20FUshCFRZxnGn8b3IJRnk6ZiAFRm5ymHJ3um8WfOZrVGyzT5RPWThScMZvAmuWe4ZqBnqWeXpuMn0qZNpphnemebxwBni1C2LGQn9Uf9Z1xmEqaDZ9pnoCZRprxm5mYFZzenoWZepitBd6frh/TIWVL9qHBnmcbwZwQnASY9ZzJnxid3iArazK04ZilmJmZoZw2nzGdmZtGnI2eKJlhn64eBJItm/md6x1Om48e5ZkFneWYzZvOms2cepoumTWbJx6VmLWekLR/wOCY3UxVmbiZdp/6nMWf6pxun4qc5J6+mzmarZqRn75WkJ3tnl4f7ZwFnIGdTZpenpSZHZqxmsKbHpplnZ2b3Z5y5LgMEpkymdabTpoFng2eRpuhmc6e6Ztemzadpp7NmhWbEZshGzWdfJ0Jn/8YKkCfTeMedJvbGfyZXZpxmmgPXZwjGhafSZj5m+mZXRw6Ys9Mn0p1myWdgpwNnKWbfZjpmP2e/phhnKmfbZzGniGZLR9LF0Oaj0mCnMKYHZlNnJmdoZmZnLGfBZsdm/Gf/Z7BHcEf6J13GP/B0AcSAKcbWZ96nr4Gvff3GaHXvxkvGG/hUyrslKSWMJjPBpuXSx+xRuYFxZzRmWOaWZg4mCYbhZ4DmZWdnZu8yGm0QGW1myWj2Z/i8nWc9Jo5m4KcQ5iSnkOejZlZGebzXMmZEOEeo5rUnEcbIpxtmPGdBZi9niOesZjtmb2aKKXRh8BN050BmAWcc519nT2amZ89mV6ZeZqqmf2aNZidnlmZAAMhGWCZA5v5JMEiXs9eytEf4x6Dneab9Zyvh8Gfipn0nNGYs5iQnpKYjY2+yFyY5Z7Dnwyac5/WmeWZpZvlmR6Y850jnO2akZxHhiuduZsrnSKaC5+jnm2dpZm6mKyccphZnBWdEZl6mPKckZv5JHgk/g99RUudrp0tmDmf5poCm9Wa3ZjJmyObURxDrZydtgdlm+2cJp8rn2uabZwemauc0Jq9nmGa85qyIhCCWARfx54bhp4OnNuZPZjrmdubc5/ln16d/Z8dmRGeLp0nGQsezxhLmp8Yx852oUWdE57mncGem57LnLubm5pDmxyYK5qzm5CxL3ZJD62Zy5irmTGaHZ6rnbudq5/bmo2dB5tRG1BuaZIEA1ucPZjbm2uau57bnPGbC5ulmTSfu5qLmnucnZ8nGhufe5tmn56BSxbYLF2bJaP7mjOfdppNnN2eB5/Fm/aep5li8VeCh5l9nceZc54dmCee659amsqeR5gMm4UYdpkopCWG55n+H06cyJtNmCOfKZojm7uci54Rmt6ZYx1BnzWfWZ88A13Cxiq749Ofb+E4RDsYMZrLny2Z9RlnnzOZB50XmS0ZBi2Klimha5mjnj2baZ67n8ebDZqOmI2bq5/LnLeaeR63n2Yj+i/zm+wBaZ+zGZeb1JuXnGOa/Z+BnieZV5nNmmkZGQAABpadnNeaoQJfabYDj4PXnoaAimR8ZdKoSZ5DJcCaHEHVnfXiB583m2eeKoOJnoaZT54UmmmbGZhtnKubh56ZmumcV5xHmGWeqZyzm1EZL55PnxuZGZhiBK+Zw55znHmb5wUPn6+fD55Xm7yeNZmLnRWYGJoYmFFAoAQmH8YfzZ+2mj2REvE9kfucGR/2MyIXYRg9nYQCqJF1ItWcImNFG3ieU5pBmYucJht7nNOdjCFNheFg1Kpfm0WddJxmHV2fPpnFnvkbM5kWmUOeAxxw6kyFLKezmk2b3RpGn8Of758Nm22fd5i3ncKcsLM/npStzuO3mHOdTRrbm+efh5gXnvGYj54fnoudU5qdmxAFn59ChxeaciqJnIOaXZnmmpBv+5k3mN2avp1nnPWbQFjWn9tORhTDnZ6fuZujm8edc52AW3eaR5zznn+Y+p/jgJ8w20KXmHecHZkNnQuZd54enB+d65yFm/2YG55bHQvlQFwkHAWq0U6YmsBfp5qbnGebXZj2nXiby5wAWxqcGwOGSJBfYF1JnHeZoF/nmeBbgZ15mNqcYF5vmvWfMgpny62dAZo9mNBc4F99nf+dd50dn4BcQZkfmkBfrJ+LmT+e1y3tr2ycE4bmBvydHkvcgPquExwcnyYDdZhDm0mcL5trGJye2p1wXPYBO5tQVOybdppcm7Md1ZxKmUAHXJr+mcQG3J/y5lKZQAfcnDyePJ0n10hbPJ3AmLyd0FxHEkef35hwXGaa4AMhGvCY05mdnIdRIaeAJABq8Fqh0YOcy5uDn5BcDqR/mfaaYFxKA6hYTIR9ng4ft5wPmoBd75mAWdBfC5xMn9Bfq5w7n2BpmCcsq7eYD55JhZadl5s9nyqboF2wWh+fsFxAXyheQF9TnPKeKoLK4sdmPwibmr+ZwFw3mHibkFz/mOhaIZhrm9haZNaSahtHUFyAXeeeGF0NmVqb/5y9nG+evZroWqEH2FpnVraD6F+HHjGaWFkLmVhdGFwnnTaf4FjenHudV50/H1eeqFhPnJSsR0c0thlrp59uHdEcM54wnjOYvp9RnK2cW5ldGgLuqW0p0KBbAZwEXg+eWF9NnVhfeFiYWPeaAFhEm34prLWxbwBYuFp4WquZeF+hm3heY5uwXFmYP5pAXycaqF3YXuNWa2iIji2akFngmZBYxFpnmK2cUFovmAED10NQWzBex51pnLBZ/5uvn2RavJj4WDua+Fr2oyjXJUv2pzuZ7poIXNBegF1kXP2YH5gknORf6557mvAEJh2EX+Ra15gVhtWV3SyQX5Gfn+Azn3ScBpw5msRf3oQgWQhZ3Z4DG1Br10XfD1+fnxgEmEaeZFmvnuBdeFmwXKReF5gwWUeZXR/0Xf9uJkv3nV4ZDpsMWuBZBFyMXeBbNF9YWuRbKF4VnYudtpmoWQ8rUuqmMnRbE5poWMuadZgCn8BY5J70Wn+cMFv0XuLu2Urk1kxYGFhYWg+e/5kPmVRajF9zmGBcmFzUXixYpNEU0gxZFJ/3mqBdw54LmGOe7FrMWIuYhFh7nWOaEF0/G+ReG5xFnx+WnJPNjdmbRFt0XWcY9F+/mzEcuF7dncRbap5pC4aT3OVsWIBZfRw0XnhYjFtkWexbVFqkWlBfCF2cD7QiF9THm4cYC5x4WrxZZFm8WTRdVF79m5xZJ56EWrRecFosWaPpAuYCZl4miZl38HWc4G5RmckFUZpkWC+frFuMXiqF9+w96ElGk55xmjGd3RoYXvxYzF28WZxfGFmMX+xYbF41FwUBAucOZpqYTZrCWA2cvp3CXwxfwl38W7xf/Fw1nI+bY5sknCxfhFvLZgBGtKf37L+btZ6CXZQEdZ0lmXWeS8Y5mcReuFsiWeJd/teaInGaSZ2iXpefol9MXyRdBFwXmqmc+F0iXBOfIlkKcjkDkl0Amk2cWF0kXgRZUlzMWihdupgumEBdJ50fmOObFZifn3cbIRmfn+OdZp2dnnIuodOFBU+Z/1K1JEUm89cUXI8Yc+d6ZuqDz5hQXTmd8Z1iXLJaAlpmmd6aclrJmfheE1DEGS2cCp2QWZuZwl4IXkJc95owXbhcvA/lB/hfMFz8WlRa7FltmmOfvF4iXqReUF0JK5oV2CDz55Relp9Rn8pbJF+XnW2YEZ0oXNhfzF5pH4+YE5qhAwQDEwevTXvRmJ1sw0aBFIQSmJkYCFi8XqGFSlzoXNJf+eKXBzoajRWQnvUdTFr8WGJcVRikXexfVFkXmaRY0eKqErq1mllIn5pZ55xaXlJezRhHn6KdjF9KWK6Zskvi8RxaHRoAnQxYOl5GmjpZWlnpnTpY2l7iWZuREvHaWysb2lxSW0xful6wXCJfgR56WypauTYGJKaEqJr6WOBeoFo0XrUcel7fHAZafFo5dJBovpuaXIMe+lu6WOmYel1SWqabhliHGCqnurYT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"))
///////////////////////////////////////////////

///////////////////////////////////////////////
/* Utility functions */

var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
  pcbdata.metadata.revision + '__#';
var storage;

function initStorage(key) {
  try {
    window.localStorage.getItem("blank");
    storage = window.localStorage;
  } catch (e) {
    // localStorage not available
  }
  if (!storage) {
    try {
      window.sessionStorage.getItem("blank");
      storage = window.sessionStorage;
    } catch (e) {
      // sessionStorage also not available
    }
  }
}

function readStorage(key) {
  if (storage) {
    return storage.getItem(storagePrefix + key);
  } else {
    return null;
  }
}

function writeStorage(key, value) {
  if (storage) {
    storage.setItem(storagePrefix + key, value);
  }
}

function fancyDblClickHandler(el, onsingle, ondouble) {
  return function() {
    if (el.getAttribute("data-dblclick") == null) {
      el.setAttribute("data-dblclick", 1);
      setTimeout(function() {
        if (el.getAttribute("data-dblclick") == 1) {
          onsingle();
        }
        el.removeAttribute("data-dblclick");
      }, 200);
    } else {
      el.removeAttribute("data-dblclick");
      ondouble();
    }
  }
}

function smoothScrollToRow(rowid) {
  document.getElementById(rowid).scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "nearest"
  });
}

function focusInputField(input) {
  input.scrollIntoView(false);
  input.focus();
  input.select();
}

function saveBomTable(output) {
  var text = '';
  for (var node of bomhead.childNodes[0].childNodes) {
    if (node.firstChild) {
      text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
    }
    if (node != bomhead.childNodes[0].lastChild) {
      text += (output == 'csv' ? ',' : '\t');
    }
  }
  text += '\n';
  for (var row of bombody.childNodes) {
    for (var cell of row.childNodes) {
      let val = '';
      for (var node of cell.childNodes) {
        if (node.nodeName == "INPUT") {
          if (node.checked) {
            val += '✓';
          }
        } else if (node.nodeName == "MARK") {
          val += node.firstChild.nodeValue;
        } else {
          val += node.nodeValue;
        }
      }
      if (output == 'csv') {
        val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
        if (isNumeric(val)) {
          val = +val;                     // use number
        } else {
          val = `"${val}"`;               // enclosed within double-quote
        }
      }
      text += val;
      if (cell != row.lastChild) {
        text += (output == 'csv' ? ',' : '\t');
      }
    }
    text += '\n';
  }

  if (output != 'clipboard') {
    // To file: csv or txt
    var blob = new Blob([text], {
      type: `text/${output}`
    });
    saveFile(`${pcbdata.metadata.title}.${output}`, blob);
  } else {
    // To clipboard
    var textArea = document.createElement("textarea");
    textArea.classList.add('clipboard-temp');
    textArea.value = text;

    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();

    try {
      if (document.execCommand('copy')) {
        console.log('Bom copied to clipboard.');
      }
    } catch (err) {
      console.log('Can not copy to clipboard.');
    }

    document.body.removeChild(textArea);
  }
}

function isNumeric(str) {
  /* https://stackoverflow.com/a/175787 */
  return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}

function removeGutterNode(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].classList &&
      node.childNodes[i].classList.contains("gutter")) {
      node.removeChild(node.childNodes[i]);
      break;
    }
  }
}

function cleanGutters() {
  removeGutterNode(document.getElementById("bot"));
  removeGutterNode(document.getElementById("canvasdiv"));
}

var units = {
  prefixes: {
    giga: ["G", "g", "giga", "Giga", "GIGA"],
    mega: ["M", "mega", "Mega", "MEGA"],
    kilo: ["K", "k", "kilo", "Kilo", "KILO"],
    milli: ["m", "milli", "Milli", "MILLI"],
    micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
    nano: ["N", "n", "nano", "Nano", "NANO"],
    pico: ["P", "p", "pico", "Pico", "PICO"],
  },
  unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  unitsLong: [
    "OHM", "Ohm", "ohm", "ohms",
    "FARAD", "Farad", "farad",
    "HENRY", "Henry", "henry"
  ],
  getMultiplier: function(s) {
    if (this.prefixes.giga.includes(s)) return 1e9;
    if (this.prefixes.mega.includes(s)) return 1e6;
    if (this.prefixes.kilo.includes(s)) return 1e3;
    if (this.prefixes.milli.includes(s)) return 1e-3;
    if (this.prefixes.micro.includes(s)) return 1e-6;
    if (this.prefixes.nano.includes(s)) return 1e-9;
    if (this.prefixes.pico.includes(s)) return 1e-12;
    return 1;
  },
  valueRegex: null,
}

function initUtils() {
  var allPrefixes = units.prefixes.giga
    .concat(units.prefixes.mega)
    .concat(units.prefixes.kilo)
    .concat(units.prefixes.milli)
    .concat(units.prefixes.micro)
    .concat(units.prefixes.nano)
    .concat(units.prefixes.pico);
  var allUnits = units.unitsShort.concat(units.unitsLong);
  units.valueRegex = new RegExp("^([0-9\.]+)" +
    "\\s*(" + allPrefixes.join("|") + ")?" +
    "(" + allUnits.join("|") + ")?" +
    "(\\b.*)?$", "");
  units.valueAltRegex = new RegExp("^([0-9]*)" +
    "(" + units.unitsShort.join("|") + ")?" +
    "([GgMmKkUuNnPp])?" +
    "([0-9]*)" +
    "(\\b.*)?$", "");
  if (config.fields.includes("Value")) {
    var index = config.fields.indexOf("Value");
    pcbdata.bom["parsedValues"] = {};
    for (var id in pcbdata.bom.fields) {
      pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
    }
  }
}

function parseValue(val, ref) {
  var inferUnit = (unit, ref) => {
    if (unit) {
      unit = unit.toLowerCase();
      if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
        unit = 'r';
      }
      unit = unit[0];
    } else {
      ref = /^([a-z]+)\d+$/i.exec(ref);
      if (ref) {
        ref = ref[1].toLowerCase();
        if (ref == "c") unit = 'f';
        else if (ref == "l") unit = 'h';
        else if (ref == "r" || ref == "rv") unit = 'r';
        else unit = null;
      }
    }
    return unit;
  };
  val = val.replace(/,/g, "");
  var match = units.valueRegex.exec(val);
  var unit;
  if (match) {
    val = parseFloat(match[1]);
    if (match[2]) {
      val = val * units.getMultiplier(match[2]);
    }
    unit = inferUnit(match[3], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[4],
    }
  }
  match = units.valueAltRegex.exec(val);
  if (match && (match[1] || match[4])) {
    val = parseFloat(match[1] + "." + match[4]);
    if (match[3]) {
      val = val * units.getMultiplier(match[3]);
    }
    unit = inferUnit(match[2], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[5],
    }
  }
  return null;
}

function valueCompare(a, b, stra, strb) {
  if (a === null && b === null) {
    // Failed to parse both values, compare them as strings.
    if (stra != strb) return stra > strb ? 1 : -1;
    else return 0;
  } else if (a === null) {
    return 1;
  } else if (b === null) {
    return -1;
  } else {
    if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
    else if (a.val != b.val) return a.val > b.val ? 1 : -1;
    else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
    else return 0;
  }
}

function validateSaveImgDimension(element) {
  var valid = false;
  var intValue = 0;
  if (/^[1-9]\d*$/.test(element.value)) {
    intValue = parseInt(element.value);
    if (intValue <= 16000) {
      valid = true;
    }
  }
  if (valid) {
    element.classList.remove("invalid");
  } else {
    element.classList.add("invalid");
  }
  return intValue;
}

function saveImage(layer) {
  var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  var bgcolor = null;
  if (!document.getElementById("render-save-transparent").checked) {
    var style = getComputedStyle(topmostdiv);
    bgcolor = style.getPropertyValue("background-color");
  }
  if (!width || !height) return;

  // Prepare image
  var canvas = document.createElement("canvas");
  var layerdict = {
    transform: {
      x: 0,
      y: 0,
      s: 1,
      panx: 0,
      pany: 0,
      zoom: 1,
    },
    bg: canvas,
    fab: canvas,
    silk: canvas,
    highlight: canvas,
    layer: layer,
  }
  // Do the rendering
  recalcLayerScale(layerdict, width, height);
  prepareLayer(layerdict);
  clearCanvas(canvas, bgcolor);
  drawBackground(layerdict, false);
  drawHighlightsOnLayer(layerdict, false);

  // Save image
  var imgdata = canvas.toDataURL("image/png");

  var filename = pcbdata.metadata.title;
  if (pcbdata.metadata.revision) {
    filename += `.${pcbdata.metadata.revision}`;
  }
  filename += `.${layer}.png`;
  saveFile(filename, dataURLtoBlob(imgdata));
}

function saveSettings() {
  var data = {
    type: "InteractiveHtmlBom settings",
    version: 1,
    pcbmetadata: pcbdata.metadata,
    settings: settings,
  }
  var blob = new Blob([JSON.stringify(data, null, 4)], {
    type: "application/json"
  });
  saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}

function loadSettings() {
  var input = document.createElement("input");
  input.type = "file";
  input.accept = ".settings.json";
  input.onchange = function(e) {
    var file = e.target.files[0];
    var reader = new FileReader();
    reader.onload = readerEvent => {
      var content = readerEvent.target.result;
      var newSettings;
      try {
        newSettings = JSON.parse(content);
      } catch (e) {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      if (newSettings.type != "InteractiveHtmlBom settings") {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
      if (metadataMatches) {
        for (var k in pcbdata.metadata) {
          if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
            metadataMatches = false;
          }
        }
      }
      if (!metadataMatches) {
        var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
        var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
        if (!confirm(
            `Settins file metadata does not match current metadata.\n\n` +
            `Page metadata:\n${currentMetadata}\n\n` +
            `Settings file metadata:\n${fileMetadata}\n\n` +
            `Press OK if you would like to import settings anyway.`)) {
          return;
        }
      }
      overwriteSettings(newSettings.settings);
    }
    reader.readAsText(file, 'UTF-8');
  }
  input.click();
}

function overwriteSettings(newSettings) {
  initDone = false;
  Object.assign(settings, newSettings);
  writeStorage("bomlayout", settings.bomlayout);
  writeStorage("bommode", settings.bommode);
  writeStorage("canvaslayout", settings.canvaslayout);
  writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  for (var checkbox of settings.checkboxes) {
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  }
  writeStorage("markWhenChecked", settings.markWhenChecked);
  padsVisible(settings.renderPads);
  document.getElementById("padsCheckbox").checked = settings.renderPads;
  fabricationVisible(settings.renderFabrication);
  document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  silkscreenVisible(settings.renderSilkscreen);
  document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  referencesVisible(settings.renderReferences);
  document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  valuesVisible(settings.renderValues);
  document.getElementById("valuesCheckbox").checked = settings.renderValues;
  tracksVisible(settings.renderTracks);
  document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  zonesVisible(settings.renderZones);
  document.getElementById("zonesCheckbox").checked = settings.renderZones;
  dnpOutline(settings.renderDnpOutline);
  document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  setRedrawOnDrag(settings.redrawOnDrag);
  document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  setDarkMode(settings.darkMode);
  document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  setHighlightPin1(settings.highlightpin1);
  document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
  showFootprints(settings.show_footprints);
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  initDone = true;
  prepCheckboxes();
  changeBomLayout(settings.bomlayout);
}

function saveFile(filename, blob) {
  var link = document.createElement("a");
  var objurl = URL.createObjectURL(blob);
  link.download = filename;
  link.href = objurl;
  link.click();
}

function dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {
    type: mime
  });
}

var settings = {
  canvaslayout: "default",
  bomlayout: "default",
  bommode: "grouped",
  checkboxes: [],
  checkboxStoredRefs: {},
  darkMode: false,
  highlightpin1: false,
  redrawOnDrag: true,
  boardRotation: 0,
  renderPads: true,
  renderReferences: true,
  renderValues: true,
  renderSilkscreen: true,
  renderFabrication: true,
  renderDnpOutline: false,
  renderTracks: true,
  renderZones: true,
  columnOrder: [],
  hiddenColumns: [],
}

function initDefaults() {
  settings.bomlayout = readStorage("bomlayout");
  if (settings.bomlayout === null) {
    settings.bomlayout = config.bom_view;
  }
  if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
    settings.bomlayout = config.bom_view;
  }
  settings.bommode = readStorage("bommode");
  if (settings.bommode === null) {
    settings.bommode = "grouped";
  }
  if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
    settings.bommode = "grouped";
  }
  settings.canvaslayout = readStorage("canvaslayout");
  if (settings.canvaslayout === null) {
    settings.canvaslayout = config.layer_view;
  }
  var bomCheckboxes = readStorage("bomCheckboxes");
  if (bomCheckboxes === null) {
    bomCheckboxes = config.checkboxes;
  }
  settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  document.getElementById("bomCheckboxes").value = bomCheckboxes;

  settings.markWhenChecked = readStorage("markWhenChecked") || "";
  populateMarkWhenCheckedOptions();

  function initBooleanSetting(storageString, def, elementId, func) {
    var b = readStorage(storageString);
    if (b === null) {
      b = def;
    } else {
      b = (b == "true");
    }
    document.getElementById(elementId).checked = b;
    func(b);
  }

  initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
  if ("tracks" in pcbdata) {
    initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
    initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  } else {
    document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
    tracksVisible(false);
    zonesVisible(false);
  }
  initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
  initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);

  var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
  var hcols = JSON.parse(readStorage("hiddenColumns"));
  if (hcols === null) {
    hcols = [];
  }
  settings.hiddenColumns = hcols.filter(e => fields.includes(e));

  var cord = JSON.parse(readStorage("columnOrder"));
  if (cord === null) {
    cord = fields;
  } else {
    cord = cord.filter(e => fields.includes(e));
    if (cord.length != fields.length)
      cord = fields;
  }
  settings.columnOrder = cord;

  settings.boardRotation = readStorage("boardRotation");
  if (settings.boardRotation === null) {
    settings.boardRotation = config.board_rotation * 5;
  } else {
    settings.boardRotation = parseInt(settings.boardRotation);
  }
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
}

// Helper classes for user js callbacks.

const IBOM_EVENT_TYPES = {
  ALL: "all",
  HIGHLIGHT_EVENT: "highlightEvent",
  CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
  BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}

const EventHandler = {
  callbacks: {},
  init: function() {
    for (eventType of Object.values(IBOM_EVENT_TYPES))
      this.callbacks[eventType] = [];
  },
  registerCallback: function(eventType, callback) {
    this.callbacks[eventType].push(callback);
  },
  emitEvent: function(eventType, eventArgs) {
    event = {
      eventType: eventType,
      args: eventArgs,
    }
    var callback;
    for (callback of this.callbacks[eventType])
      callback(event);
    for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
      callback(event);
  }
}
EventHandler.init();

///////////////////////////////////////////////

///////////////////////////////////////////////
/* PCB rendering code */

var emptyContext2d = document.createElement("canvas").getContext("2d");

function deg2rad(deg) {
  return deg * Math.PI / 180;
}

function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  var point = [
    linepoint[0] * text.width + offsetx,
    linepoint[1] * text.height + offsety
  ];
  // This approximates pcbnew behavior with how text tilts depending on horizontal justification
  point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
  return point;
}

function drawText(ctx, text, color) {
  if ("ref" in text && !settings.renderReferences) return;
  if ("val" in text && !settings.renderValues) return;
  ctx.save();
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  ctx.lineWidth = text.thickness;
  if ("svgpath" in text) {
    ctx.stroke(new Path2D(text.svgpath));
    ctx.restore();
    return;
  }
  if ("polygons" in text) {
    ctx.fill(getPolygonsPath(text));
    ctx.restore();
    return;
  }
  ctx.translate(...text.pos);
  ctx.translate(text.thickness * 0.5, 0);
  var angle = -text.angle;
  if (text.attr.includes("mirrored")) {
    ctx.scale(-1, 1);
    angle = -angle;
  }
  var tilt = 0;
  if (text.attr.includes("italic")) {
    tilt = 0.125;
  }
  var interline = text.height * 1.5 + text.thickness;
  var txt = text.text.split("\n");
  // KiCad ignores last empty line.
  if (txt[txt.length - 1] == '') txt.pop();
  ctx.rotate(deg2rad(angle));
  var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
  offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
  for (var i in txt) {
    var lineWidth = text.thickness + interline / 2 * tilt;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        lineWidth += fourSpaces - lineWidth % fourSpaces;
      } else {
        if (txt[i][j] == '~') {
          j++;
          if (j == txt[i].length)
            break;
        }
        lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
      }
    }
    var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
    var inOverbar = false;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        offsetx += fourSpaces - offsetx % fourSpaces;
        continue;
      } else if (txt[i][j] == '~') {
        j++;
        if (j == txt[i].length)
          break;
        if (txt[i][j] != '~') {
          inOverbar = !inOverbar;
        }
      }
      var glyph = pcbdata.font_data[txt[i][j]];
      if (inOverbar) {
        var overbarStart = [offsetx, -text.height * 1.4 + offsety];
        var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];

        if (!lastHadOverbar) {
          overbarStart[0] += text.height * 1.4 * tilt;
          lastHadOverbar = true;
        }
        ctx.beginPath();
        ctx.moveTo(...overbarStart);
        ctx.lineTo(...overbarEnd);
        ctx.stroke();
      } else {
        lastHadOverbar = false;
      }
      for (var line of glyph.l) {
        ctx.beginPath();
        ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
        for (var k = 1; k < line.length; k++) {
          ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
        }
        ctx.stroke();
      }
      offsetx += glyph.w * text.width;
    }
    offsety += interline;
  }
  ctx.restore();
}

function drawedge(ctx, scalefactor, edge, color) {
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  if ("svgpath" in edge) {
    ctx.stroke(new Path2D(edge.svgpath));
  } else {
    ctx.beginPath();
    if (edge.type == "segment") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(...edge.end);
    }
    if (edge.type == "rect") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(edge.start[0], edge.end[1]);
      ctx.lineTo(...edge.end);
      ctx.lineTo(edge.end[0], edge.start[1]);
      ctx.lineTo(...edge.start);
    }
    if (edge.type == "arc") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        deg2rad(edge.startangle),
        deg2rad(edge.endangle));
    }
    if (edge.type == "circle") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        0, 2 * Math.PI);
      ctx.closePath();
    }
    if (edge.type == "curve") {
      ctx.moveTo(...edge.start);
      ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
    }
    if("filled" in edge && edge.filled)
      ctx.fill();
    else
      ctx.stroke();
  }
}

function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  var path = new Path2D();
  var width = size[0];
  var height = size[1];
  var x = width * -0.5;
  var y = height * -0.5;
  var chamfOffset = Math.min(width, height) * chamfratio;
  path.moveTo(x, 0);
  if (chamfpos & 4) {
    path.lineTo(x, y + height - chamfOffset);
    path.lineTo(x + chamfOffset, y + height);
    path.lineTo(0, y + height);
  } else {
    path.arcTo(x, y + height, x + width, y + height, radius);
  }
  if (chamfpos & 8) {
    path.lineTo(x + width - chamfOffset, y + height);
    path.lineTo(x + width, y + height - chamfOffset);
    path.lineTo(x + width, 0);
  } else {
    path.arcTo(x + width, y + height, x + width, y, radius);
  }
  if (chamfpos & 2) {
    path.lineTo(x + width, y + chamfOffset);
    path.lineTo(x + width - chamfOffset, y);
    path.lineTo(0, y);
  } else {
    path.arcTo(x + width, y, x, y, radius);
  }
  if (chamfpos & 1) {
    path.lineTo(x + chamfOffset, y);
    path.lineTo(x, y + chamfOffset);
    path.lineTo(x, 0);
  } else {
    path.arcTo(x, y, x, y + height, radius);
  }
  path.closePath();
  return path;
}

function getOblongPath(size) {
  return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}

function getPolygonsPath(shape) {
  if (shape.path2d) {
    return shape.path2d;
  }
  if ("svgpath" in shape) {
    shape.path2d = new Path2D(shape.svgpath);
  } else {
    var path = new Path2D();
    for (var polygon of shape.polygons) {
      path.moveTo(...polygon[0]);
      for (var i = 1; i < polygon.length; i++) {
        path.lineTo(...polygon[i]);
      }
      path.closePath();
    }
    shape.path2d = path;
  }
  return shape.path2d;
}

function drawPolygonShape(ctx, scalefactor, shape, color) {
  ctx.save();
  if (!("svgpath" in shape)) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  if("filled" in shape && !shape.filled) {
    ctx.strokeStyle = color;
    ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
    ctx.lineCap = "round";
    ctx.lineJoin = "round";
    ctx.stroke(getPolygonsPath(shape));
  } else {
    ctx.fillStyle = color;
    ctx.fill(getPolygonsPath(shape));
  }
  ctx.restore();
}

function drawDrawing(ctx, scalefactor, drawing, color) {
  if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
    drawedge(ctx, scalefactor, drawing, color);
  } else if (drawing.type == "polygon") {
    drawPolygonShape(ctx, scalefactor, drawing, color);
  } else {
    drawText(ctx, drawing, color);
  }
}

function getCirclePath(radius) {
  var path = new Path2D();
  path.arc(0, 0, radius, 0, 2 * Math.PI);
  path.closePath();
  return path;
}

function getCachedPadPath(pad) {
  if (!pad.path2d) {
    // if path2d is not set, build one and cache it on pad object
    if (pad.shape == "rect") {
      pad.path2d = new Path2D();
      pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
    } else if (pad.shape == "oval") {
      pad.path2d = getOblongPath(pad.size);
    } else if (pad.shape == "circle") {
      pad.path2d = getCirclePath(pad.size[0] / 2);
    } else if (pad.shape == "roundrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
    } else if (pad.shape == "chamfrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
    } else if (pad.shape == "custom") {
      pad.path2d = getPolygonsPath(pad);
    }
  }
  return pad.path2d;
}

function drawPad(ctx, pad, color, outline) {
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(-deg2rad(pad.angle));
  if (pad.offset) {
    ctx.translate(...pad.offset);
  }
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  var path = getCachedPadPath(pad);
  if (outline) {
    ctx.stroke(path);
  } else {
    ctx.fill(path);
  }
  ctx.restore();
}

function drawPadHole(ctx, pad, padHoleColor) {
  if (pad.type != "th") return;
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(-deg2rad(pad.angle));
  ctx.fillStyle = padHoleColor;
  if (pad.drillshape == "oblong") {
    ctx.fill(getOblongPath(pad.drillsize));
  } else {
    ctx.fill(getCirclePath(pad.drillsize[0] / 2));
  }
  ctx.restore();
}

function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
  if (highlight) {
    // draw bounding box
    if (footprint.layer == layer) {
      ctx.save();
      ctx.globalAlpha = 0.2;
      ctx.translate(...footprint.bbox.pos);
      ctx.rotate(deg2rad(-footprint.bbox.angle));
      ctx.translate(...footprint.bbox.relpos);
      ctx.fillStyle = colors.pad;
      ctx.fillRect(0, 0, ...footprint.bbox.size);
      ctx.globalAlpha = 1;
      ctx.strokeStyle = colors.pad;
      ctx.strokeRect(0, 0, ...footprint.bbox.size);
      ctx.restore();
    }
  }
  // draw drawings
  for (var drawing of footprint.drawings) {
    if (drawing.layer == layer) {
      drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
    }
  }
  // draw pads
  if (settings.renderPads) {
    for (var pad of footprint.pads) {
      if (pad.layers.includes(layer)) {
        drawPad(ctx, pad, colors.pad, outline);
        if (pad.pin1 && settings.highlightpin1) {
          drawPad(ctx, pad, colors.outline, true);
        }
      }
    }
    for (var pad of footprint.pads) {
      drawPadHole(ctx, pad, colors.padHole);
    }
  }
}

function drawEdgeCuts(canvas, scalefactor) {
  var ctx = canvas.getContext("2d");
  var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  for (var edge of pcbdata.edges) {
    drawDrawing(ctx, scalefactor, edge, edgecolor);
  }
}

function drawFootprints(canvas, layer, scalefactor, highlight) {
  var ctx = canvas.getContext("2d");
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);

  var colors = {
    pad: style.getPropertyValue('--pad-color'),
    padHole: style.getPropertyValue('--pad-hole-color'),
    outline: style.getPropertyValue('--pin1-outline-color'),
  }

  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var mod = pcbdata.footprints[i];
    var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
    var h = highlightedFootprints.includes(i);
    var d = markedFootprints.has(i);
    if (highlight) {
      if(h && d) {
        colors.pad = style.getPropertyValue('--pad-color-highlight-both');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
      } else if (h) {
        colors.pad = style.getPropertyValue('--pad-color-highlight');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
      } else if (d) {
        colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
        colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
      }
    }
    if( h || d || !highlight) {
      drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
    }
  }
}

function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  var ctx = canvas.getContext("2d");
  for (var d of pcbdata.drawings[layername][layer]) {
    if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
      drawedge(ctx, scalefactor, d, edgeColor);
    } else if (d.type == "polygon") {
      drawPolygonShape(ctx, scalefactor, d, polygonColor);
    } else {
      drawText(ctx, d, textColor);
    }
  }
}

function drawTracks(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  for (var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    ctx.lineWidth = track.width;
    ctx.beginPath();
    if ('radius' in track) {
      ctx.arc(
        ...track.center,
        track.radius,
        deg2rad(track.startangle),
        deg2rad(track.endangle));
    } else {
      ctx.moveTo(...track.start);
      ctx.lineTo(...track.end);
    }
    ctx.stroke();
  }
}

function drawZones(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineJoin = "round";
  for (var zone of pcbdata.zones[layer]) {
    if (!zone.path2d) {
      zone.path2d = getPolygonsPath(zone);
    }
    if (highlight && highlightedNet != zone.net) continue;
    ctx.fill(zone.path2d);
    if (zone.width > 0) {
      ctx.lineWidth = zone.width;
      ctx.stroke(zone.path2d);
    }
  }
}

function clearCanvas(canvas, color = null) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  if (color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  } else {
    if (!window.matchMedia("print").matches)
      ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.restore();
}

function drawNets(canvas, layer, highlight) {
  var style = getComputedStyle(topmostdiv);
  if (settings.renderTracks) {
    var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
    drawTracks(canvas, layer, trackColor, highlight);
  }
  if (settings.renderZones) {
    var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
    drawZones(canvas, layer, zoneColor, highlight);
  }
  if (highlight && settings.renderPads) {
    var padColor = style.getPropertyValue('--pad-color-highlight');
    var padHoleColor = style.getPropertyValue('--pad-hole-color');
    var ctx = canvas.getContext("2d");
    for (var footprint of pcbdata.footprints) {
      // draw pads
      var padDrawn = false;
      for (var pad of footprint.pads) {
        if (highlightedNet != pad.net) continue;
        if (pad.layers.includes(layer)) {
          drawPad(ctx, pad, padColor, false);
          padDrawn = true;
        }
      }
      if (padDrawn) {
        // redraw all pad holes because some pads may overlap
        for (var pad of footprint.pads) {
          drawPadHole(ctx, pad, padHoleColor);
        }
      }
    }
  }
}

function drawHighlightsOnLayer(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.highlight);
  }
  if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
    drawFootprints(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true);
  }
  if (highlightedNet !== null) {
    drawNets(canvasdict.highlight, canvasdict.layer, true);
  }
}

function drawHighlights() {
  drawHighlightsOnLayer(allcanvas.front);
  drawHighlightsOnLayer(allcanvas.back);
}

function drawBackground(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.bg);
    clearCanvas(canvasdict.fab);
    clearCanvas(canvasdict.silk);
  }

  drawNets(canvasdict.bg, canvasdict.layer, false);
  drawFootprints(canvasdict.bg, canvasdict.layer,
    canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);

  var style = getComputedStyle(topmostdiv);
  var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  var textColor = style.getPropertyValue('--silkscreen-text-color');
  if (settings.renderSilkscreen) {
    drawBgLayer(
      "silkscreen", canvasdict.silk, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
  edgeColor = style.getPropertyValue('--fabrication-edge-color');
  polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  textColor = style.getPropertyValue('--fabrication-text-color');
  if (settings.renderFabrication) {
    drawBgLayer(
      "fabrication", canvasdict.fab, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
}

function prepareCanvas(canvas, flip, transform) {
  var ctx = canvas.getContext("2d");
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  ctx.scale(transform.zoom, transform.zoom);
  ctx.translate(transform.panx, transform.pany);
  if (flip) {
    ctx.scale(-1, 1);
  }
  ctx.translate(transform.x, transform.y);
  ctx.rotate(deg2rad(settings.boardRotation));
  ctx.scale(transform.s, transform.s);
}

function prepareLayer(canvasdict) {
  var flip = (canvasdict.layer == "B");
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  }
}

function rotateVector(v, angle) {
  angle = deg2rad(angle);
  return [
    v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
    v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  ];
}

function applyRotation(bbox) {
  var corners = [
    [bbox.minx, bbox.miny],
    [bbox.minx, bbox.maxy],
    [bbox.maxx, bbox.miny],
    [bbox.maxx, bbox.maxy],
  ];
  corners = corners.map((v) => rotateVector(v, settings.boardRotation));
  return {
    minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
    miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
    maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
    maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  }
}

function recalcLayerScale(layerdict, width, height) {
  var bbox = applyRotation(pcbdata.edges_bbox);
  var scalefactor = 0.98 * Math.min(
    width / (bbox.maxx - bbox.minx),
    height / (bbox.maxy - bbox.miny)
  );
  if (scalefactor < 0.1) {
    scalefactor = 1;
  }
  layerdict.transform.s = scalefactor;
  var flip = (layerdict.layer == "B");
  if (flip) {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  } else {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  }
  layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    canvas = layerdict[c];
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = (width / devicePixelRatio) + "px";
    canvas.style.height = (height / devicePixelRatio) + "px";
  }
}

function redrawCanvas(layerdict) {
  prepareLayer(layerdict);
  drawBackground(layerdict);
  drawHighlightsOnLayer(layerdict);
}

function resizeCanvas(layerdict) {
  var canvasdivid = {
    "F": "frontcanvas",
    "B": "backcanvas"
  } [layerdict.layer];
  var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  recalcLayerScale(layerdict, width, height);
  redrawCanvas(layerdict);
}

function resizeAll() {
  resizeCanvas(allcanvas.front);
  resizeCanvas(allcanvas.back);
}

function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  var A = x - x1;
  var B = y - y1;
  var C = x2 - x1;
  var D = y2 - y1;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var dx, dy;
  if (len_sq == 0) {
    // start and end of the segment coincide
    dx = x - x1;
    dy = y - y1;
  } else {
    var param = dot / len_sq;
    var xx, yy;
    if (param < 0) {
      xx = x1;
      yy = y1;
    } else if (param > 1) {
      xx = x2;
      yy = y2;
    } else {
      xx = x1 + param * C;
      yy = y1 + param * D;
    }
    dx = x - xx;
    dy = y - yy;
  }
  return dx * dx + dy * dy <= d * d;
}

function modulo(n, mod) {
  return ((n % mod) + mod) % mod;
}

function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
  var dx = x - xc;
  var dy = y - yc;
  var r_sq = dx * dx + dy * dy;
  var rmin = Math.max(0, radius - d);
  var rmax = radius + d;

  if (r_sq < rmin * rmin || r_sq > rmax * rmax)
    return false;

  var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
  var dx1 = xc + radius * Math.cos(angle1) - x;
  var dy1 = yc + radius * Math.sin(angle1) - y;
  if (dx1 * dx1 + dy1 * dy1 <= d * d)
    return true;

  var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
  var dx2 = xc + radius * Math.cos(angle2) - x;
  var dy2 = yc + radius * Math.sin(angle2) - y;
  if (dx2 * dx2 + dy2 * dy2 <= d * d)
    return true;

  var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
  if (angle1 > angle2)
    return (angle >= angle2 || angle <= angle1);
  else
    return (angle >= angle1 && angle <= angle2);
}

function pointWithinPad(x, y, pad) {
  var v = [x - pad.pos[0], y - pad.pos[1]];
  v = rotateVector(v, pad.angle);
  if (pad.offset) {
    v[0] -= pad.offset[0];
    v[1] -= pad.offset[1];
  }
  return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}

function netHitScan(layer, x, y) {
  // Check track segments
  if (settings.renderTracks && pcbdata.tracks) {
    for (var track of pcbdata.tracks[layer]) {
      if ('radius' in track) {
        if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
          return track.net;
        }
      } else {
        if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
          return track.net;
        }
      }
    }
  }
  // Check pads
  if (settings.renderPads) {
    for (var footprint of pcbdata.footprints) {
      for (var pad of footprint.pads) {
        if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
          return pad.net;
        }
      }
    }
  }
  return null;
}

function pointWithinFootprintBbox(x, y, bbox) {
  var v = [x - bbox.pos[0], y - bbox.pos[1]];
  v = rotateVector(v, bbox.angle);
  return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
    bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}

function bboxHitScan(layer, x, y) {
  var result = [];
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    var footprint = pcbdata.footprints[i];
    if (footprint.layer == layer) {
      if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
        result.push(i);
      }
    }
  }
  return result;
}

function handlePointerDown(e, layerdict) {
  if (e.button != 0 && e.button != 1) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  layerdict.pointerStates[e.pointerId] = {
    distanceTravelled: 0,
    lastX: e.offsetX,
    lastY: e.offsetY,
    downTime: Date.now(),
  };
}

function handleMouseClick(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var x = e.offsetX;
  var y = e.offsetY;
  var t = layerdict.transform;
  if (layerdict.layer == "B") {
    x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  } else {
    x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  }
  y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  var v = rotateVector([x, y], -settings.boardRotation);
  if ("nets" in pcbdata) {
    var net = netHitScan(layerdict.layer, ...v);
    if (net !== highlightedNet) {
      netClicked(net);
    }
  }
  if (highlightedNet === null) {
    var footprints = bboxHitScan(layerdict.layer, ...v);
    if (footprints.length > 0) {
      footprintsClicked(footprints);
    }
  }
}

function handlePointerLeave(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();

  if (!settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }

  delete layerdict.pointerStates[e.pointerId];
}

function resetTransform(layerdict) {
  layerdict.transform.panx = 0;
  layerdict.transform.pany = 0;
  layerdict.transform.zoom = 1;
  redrawCanvas(layerdict);
}

function handlePointerUp(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  e.preventDefault();
  e.stopPropagation();

  if (e.button == 2) {
    // Reset pan and zoom on right click.
    resetTransform(layerdict);
    layerdict.anotherPointerTapped = false;
    return;
  }

  // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  var ptr = layerdict.pointerStates[e.pointerId];
  ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);

  if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
    if (Object.keys(layerdict.pointerStates).length == 1) {
      if (layerdict.anotherPointerTapped) {
        // This is the second pointer coming off of a two-finger tap
        resetTransform(layerdict);
      } else {
        // This is just a regular tap
        handleMouseClick(e, layerdict);
      }
      layerdict.anotherPointerTapped = false;
    } else {
      // This is the first finger coming off of what could become a two-finger tap
      layerdict.anotherPointerTapped = true;
    }
  } else {
    if (!settings.redrawOnDrag) {
      redrawCanvas(layerdict);
    }
    layerdict.anotherPointerTapped = false;
  }

  delete layerdict.pointerStates[e.pointerId];
}

function handlePointerMove(e, layerdict) {
  if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var thisPtr = layerdict.pointerStates[e.pointerId];

  var dx = e.offsetX - thisPtr.lastX;
  var dy = e.offsetY - thisPtr.lastY;

  // If this number is low on pointer up, we count the action as a click
  thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);

  if (Object.keys(layerdict.pointerStates).length == 1) {
    // This is a simple drag
    layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
    layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  } else if (Object.keys(layerdict.pointerStates).length == 2) {
    var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];

    var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
    var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));

    var scaleFactor = newDist / oldDist;

    if (scaleFactor != NaN) {
      layerdict.transform.zoom *= scaleFactor;

      var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
      layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
      layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
    }
  }

  thisPtr.lastX = e.offsetX;
  thisPtr.lastY = e.offsetY;

  if (settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }
}

function handleMouseWheel(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();
  var t = layerdict.transform;
  var wheeldelta = e.deltaY;
  if (e.deltaMode == 1) {
    // FF only, scroll by lines
    wheeldelta *= 30;
  } else if (e.deltaMode == 2) {
    wheeldelta *= 300;
  }
  var m = Math.pow(1.1, -wheeldelta / 40);
  // Limit amount of zoom per tick.
  if (m > 2) {
    m = 2;
  } else if (m < 0.5) {
    m = 0.5;
  }
  t.zoom *= m;
  var zoomd = (1 - m) / t.zoom;
  t.panx += devicePixelRatio * e.offsetX * zoomd;
  t.pany += devicePixelRatio * e.offsetY * zoomd;
  redrawCanvas(layerdict);
}

function addMouseHandlers(div, layerdict) {
  div.addEventListener("pointerdown", function(e) {
    handlePointerDown(e, layerdict);
  });
  div.addEventListener("pointermove", function(e) {
    handlePointerMove(e, layerdict);
  });
  div.addEventListener("pointerup", function(e) {
    handlePointerUp(e, layerdict);
  });
  var pointerleave = function(e) {
    handlePointerLeave(e, layerdict);
  }
  div.addEventListener("pointercancel", pointerleave);
  div.addEventListener("pointerleave", pointerleave);
  div.addEventListener("pointerout", pointerleave);

  div.onwheel = function(e) {
    handleMouseWheel(e, layerdict);
  }
  for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
    element.addEventListener("contextmenu", function(e) {
      e.preventDefault();
    }, false);
  }
}

function setRedrawOnDrag(value) {
  settings.redrawOnDrag = value;
  writeStorage("redrawOnDrag", value);
}

function setBoardRotation(value) {
  settings.boardRotation = value * 5;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  resizeAll();
}

function initRender() {
  allcanvas = {
    front: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("F_bg"),
      fab: document.getElementById("F_fab"),
      silk: document.getElementById("F_slk"),
      highlight: document.getElementById("F_hl"),
      layer: "F",
    },
    back: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("B_bg"),
      fab: document.getElementById("B_fab"),
      silk: document.getElementById("B_slk"),
      highlight: document.getElementById("B_hl"),
      layer: "B",
    }
  };
  addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/*
 * Table reordering via Drag'n'Drop
 * Inspired by: https://htmldom.dev/drag-and-drop-table-column
 */

function setBomHandlers() {

  const bom = document.getElementById('bomtable');

  let dragName;
  let placeHolderElements;
  let draggingElement;
  let forcePopulation;
  let xOffset;
  let yOffset;
  let wasDragged;

  const mouseUpHandler = function(e) {
    // Delete dragging element
    draggingElement.remove();

    // Make BOM selectable again
    bom.style.removeProperty("userSelect");

    // Remove listeners
    document.removeEventListener('mousemove', mouseMoveHandler);
    document.removeEventListener('mouseup', mouseUpHandler);

    if (wasDragged) {
      // Redraw whole BOM
      populateBomTable();
    }
  }

  const mouseMoveHandler = function(e) {
    // Notice the dragging
    wasDragged = true;

    // Make the dragged element visible
    draggingElement.style.removeProperty("display");

    // Set elements position to mouse position
    draggingElement.style.left = `${e.screenX - xOffset}px`;
    draggingElement.style.top = `${e.screenY - yOffset}px`;

    // Forced redrawing of BOM table
    if (forcePopulation) {
      forcePopulation = false;
      // Copy array
      phe = Array.from(placeHolderElements);
      // populate BOM table again
      populateBomHeader(dragName, phe);
      populateBomBody(dragName, phe);
    }

    // Set up array of hidden columns
    var hiddenColumns = Array.from(settings.hiddenColumns);
    // In the ungrouped mode, quantity don't exist
    if (settings.bommode === "ungrouped")
      hiddenColumns.push("Quantity");
    // If no checkbox fields can be found, we consider them hidden
    if (settings.checkboxes.length == 0)
      hiddenColumns.push("checkboxes");

    // Get table headers and group them into checkboxes, extrafields and normal headers
    const bh = document.getElementById("bomhead");
    headers = Array.from(bh.querySelectorAll("th"))
    headers.shift() // numCol is not part of the columnOrder
    headerGroups = []
    lastCompoundClass = null;
    for (i = 0; i < settings.columnOrder.length; i++) {
      cElem = settings.columnOrder[i];
      if (hiddenColumns.includes(cElem)) {
        // Hidden columns appear as a dummy element
        headerGroups.push([]);
        continue;
      }
      elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
      if (elem.classList.contains("bom-checkbox")) {
        if (lastCompoundClass === "bom-checkbox") {
          cbGroup = headerGroups.pop();
          cbGroup.push(elem);
          headerGroups.push(cbGroup);
        } else {
          lastCompoundClass = "bom-checkbox";
          headerGroups.push([elem])
        }
      } else {
        headerGroups.push([elem])
      }
    }

    // Copy settings.columnOrder
    var columns = Array.from(settings.columnOrder)

    // Set up array with indices of hidden columns
    var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
    var dragIndex = columns.indexOf(dragName);
    var swapIndex = dragIndex;
    var swapDone = false;

    // Check if the current dragged element is swapable with the left or right element
    if (dragIndex > 0) {
      // Get left headers boundingbox
      swapIndex = dragIndex - 1;
      while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
        swapIndex--;
      if (!hiddenIndices.includes(swapIndex)) {
        box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
        if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
          swapElement = columns[dragIndex];
          columns.splice(dragIndex, 1);
          columns.splice(swapIndex, 0, swapElement);
          forcePopulation = true;
          swapDone = true;
        }
      }
    }
    if ((!swapDone) && dragIndex < headerGroups.length - 1) {
      // Get right headers boundingbox
      swapIndex = dragIndex + 1;
      while (hiddenIndices.includes(swapIndex))
        swapIndex++;
      if (swapIndex < headerGroups.length) {
        box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
        if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
          swapElement = columns[dragIndex];
          columns.splice(dragIndex, 1);
          columns.splice(swapIndex, 0, swapElement);
          forcePopulation = true;
          swapDone = true;
        }
      }
    }

    // Write back change to storage
    if (swapDone) {
      settings.columnOrder = columns
      writeStorage("columnOrder", JSON.stringify(columns));
    }

  }

  const mouseDownHandler = function(e) {
    var target = e.target;
    if (target.tagName.toLowerCase() != "td")
      target = target.parentElement;

    // Used to check if a dragging has ever happened
    wasDragged = false;

    // Create new element which will be displayed as the dragged column
    draggingElement = document.createElement("div")
    draggingElement.classList.add("dragging");
    draggingElement.style.display = "none";
    draggingElement.style.position = "absolute";
    draggingElement.style.overflow = "hidden";

    // Get bomhead and bombody elements
    const bh = document.getElementById("bomhead");
    const bb = document.getElementById("bombody");

    // Get all compound headers for the current column
    var compoundHeaders;
    if (target.classList.contains("bom-checkbox")) {
      compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
    } else {
      compoundHeaders = [target];
    }

    // Create new table which will display the column
    var newTable = document.createElement("table");
    newTable.classList.add("bom");
    newTable.style.background = "white";
    draggingElement.append(newTable);

    // Create new header element
    var newHeader = document.createElement("thead");
    newTable.append(newHeader);

    // Set up array for storing all placeholder elements
    placeHolderElements = [];

    // Add all compound headers to the new thead element and placeholders
    compoundHeaders.forEach(function(h) {
      clone = cloneElementWithDimensions(h);
      newHeader.append(clone);
      placeHolderElements.push(clone);
    });

    // Create new body element
    var newBody = document.createElement("tbody");
    newTable.append(newBody);

    // Get indices for compound headers
    var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));

    // For each row in the BOM body...
    var rows = bb.querySelectorAll("tr");
    rows.forEach(function(row) {
      // ..get the cells for the compound column
      const tds = row.querySelectorAll("td");
      var copytds = idxs.map(i => tds[i]);
      // Add them to the new element and the placeholders
      var newRow = document.createElement("tr");
      copytds.forEach(function(td) {
        clone = cloneElementWithDimensions(td);
        newRow.append(clone);
        placeHolderElements.push(clone);
      });
      newBody.append(newRow);
    });

    // Compute width for compound header
    var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
    draggingElement.style.width = `${width}px`;

    // Insert the new dragging element and disable selection on BOM
    bom.insertBefore(draggingElement, null);
    bom.style.userSelect = "none";

    // Determine the mouse position offset
    xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
    yOffset = e.screenY - compoundHeaders[0].offsetTop;

    // Get name for the column in settings.columnOrder
    dragName = getColumnOrderName(target);

    // Change text and class for placeholder elements
    placeHolderElements = placeHolderElements.map(function(e) {
      newElem = cloneElementWithDimensions(e);
      newElem.textContent = "";
      newElem.classList.add("placeholder");
      return newElem;
    });

    // On next mouse move, the whole BOM needs to be redrawn to show the placeholders
    forcePopulation = true;

    // Add listeners for move and up on mouse
    document.addEventListener('mousemove', mouseMoveHandler);
    document.addEventListener('mouseup', mouseUpHandler);
  }

  // In netlist mode, there is nothing to reorder
  if (settings.bommode === "netlist")
    return;

  // Add mouseDownHandler to every column except the numCol
  bom.querySelectorAll("th")
    .forEach(function(head) {
      if (!head.classList.contains("numCol")) {
        head.onmousedown = mouseDownHandler;
      }
    });

}

function getBoundingClientRectFromMultiple(elements) {
  var elems = Array.from(elements);

  if (elems.length == 0)
    return null;

  var box = elems.shift()
    .getBoundingClientRect();

  elems.forEach(function(elem) {
    var elembox = elem.getBoundingClientRect();
    box.left = Math.min(elembox.left, box.left);
    box.top = Math.min(elembox.top, box.top);
    box.width += elembox.width;
    box.height = Math.max(elembox.height, box.height);
  });

  return box;
}

function cloneElementWithDimensions(elem) {
  var newElem = elem.cloneNode(true);
  newElem.style.height = window.getComputedStyle(elem).height;
  newElem.style.width = window.getComputedStyle(elem).width;
  return newElem;
}

function getBomTableHeaderIndex(elem) {
  const bh = document.getElementById('bomhead');
  const ths = Array.from(bh.querySelectorAll("th"));
  return ths.indexOf(elem);
}

function getColumnOrderName(elem) {
  var cname = elem.getAttribute("col_name");
  if (cname === "bom-checkbox")
    return "checkboxes";
  else
    return cname;
}

function resizableGrid(tablehead) {
  var cols = tablehead.firstElementChild.children;
  var rowWidth = tablehead.offsetWidth;

  for (var i = 1; i < cols.length; i++) {
    if (cols[i].classList.contains("bom-checkbox"))
      continue;
    cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
  }

  for (var i = 1; i < cols.length - 1; i++) {
    var div = document.createElement('div');
    div.className = "column-width-handle";
    cols[i].appendChild(div);
    setListeners(div);
  }

  function setListeners(div) {
    var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;

    div.addEventListener('mousedown', function(e) {
      e.preventDefault();
      e.stopPropagation();

      curCol = e.target.parentElement;
      nxtCol = curCol.nextElementSibling;
      startX = e.pageX;

      var padding = paddingDiff(curCol);

      rowWidth = curCol.parentElement.offsetWidth;
      curColWidth = curCol.clientWidth - padding;
      nxtColWidth = nxtCol.clientWidth - padding;
    });

    document.addEventListener('mousemove', function(e) {
      if (startX) {
        var diffX = e.pageX - startX;
        diffX = -Math.min(-diffX, curColWidth - 20);
        diffX = Math.min(diffX, nxtColWidth - 20);

        curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
        nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
        console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
      }
    });

    document.addEventListener('mouseup', function(e) {
      curCol = undefined;
      nxtCol = undefined;
      startX = undefined;
      nxtColWidth = undefined;
      curColWidth = undefined
    });
  }

  function paddingDiff(col) {

    if (getStyleVal(col, 'box-sizing') == 'border-box') {
      return 0;
    }

    var padLeft = getStyleVal(col, 'padding-left');
    var padRight = getStyleVal(col, 'padding-right');
    return (parseInt(padLeft) + parseInt(padRight));

  }

  function getStyleVal(elm, css) {
    return (window.getComputedStyle(elm, null).getPropertyValue(css))
  }
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* DOM manipulation and misc code */

var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
var highlightedNet = null;
var lastClicked;

function dbg(html) {
  dbgdiv.innerHTML = html;
}

function redrawIfInitDone() {
  if (initDone) {
    redrawCanvas(allcanvas.front);
    redrawCanvas(allcanvas.back);
  }
}

function padsVisible(value) {
  writeStorage("padsVisible", value);
  settings.renderPads = value;
  redrawIfInitDone();
}

function referencesVisible(value) {
  writeStorage("referencesVisible", value);
  settings.renderReferences = value;
  redrawIfInitDone();
}

function valuesVisible(value) {
  writeStorage("valuesVisible", value);
  settings.renderValues = value;
  redrawIfInitDone();
}

function tracksVisible(value) {
  writeStorage("tracksVisible", value);
  settings.renderTracks = value;
  redrawIfInitDone();
}

function zonesVisible(value) {
  writeStorage("zonesVisible", value);
  settings.renderZones = value;
  redrawIfInitDone();
}

function dnpOutline(value) {
  writeStorage("dnpOutline", value);
  settings.renderDnpOutline = value;
  redrawIfInitDone();
}

function setDarkMode(value) {
  if (value) {
    topmostdiv.classList.add("dark");
  } else {
    topmostdiv.classList.remove("dark");
  }
  writeStorage("darkmode", value);
  settings.darkMode = value;
  redrawIfInitDone();
}

function setShowBOMColumn(field, value) {
  if (field === "references") {
    var rl = document.getElementById("reflookup");
    rl.disabled = !value;
    if (!value) {
      rl.value = "";
      updateRefLookup("");
    }
  }

  var n = settings.hiddenColumns.indexOf(field);
  if (value) {
    if (n != -1) {
      settings.hiddenColumns.splice(n, 1);
    }
  } else {
    if (n == -1) {
      settings.hiddenColumns.push(field);
    }
  }

  writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));

  if (initDone) {
    populateBomTable();
  }

  redrawIfInitDone();
}


function setFullscreen(value) {
  if (value) {
    document.documentElement.requestFullscreen();
  } else {
    document.exitFullscreen();
  }
}

function fabricationVisible(value) {
  writeStorage("fabricationVisible", value);
  settings.renderFabrication = value;
  redrawIfInitDone();
}

function silkscreenVisible(value) {
  writeStorage("silkscreenVisible", value);
  settings.renderSilkscreen = value;
  redrawIfInitDone();
}

function setHighlightPin1(value) {
  writeStorage("highlightpin1", value);
  settings.highlightpin1 = value;
  redrawIfInitDone();
}

function getStoredCheckboxRefs(checkbox) {
  function convert(ref) {
    var intref = parseInt(ref);
    if (isNaN(intref)) {
      for (var i = 0; i < pcbdata.footprints.length; i++) {
        if (pcbdata.footprints[i].ref == ref) {
          return i;
        }
      }
      return -1;
    } else {
      return intref;
    }
  }
  if (!(checkbox in settings.checkboxStoredRefs)) {
    var val = readStorage("checkbox_" + checkbox);
    settings.checkboxStoredRefs[checkbox] = val ? val : "";
  }
  if (!settings.checkboxStoredRefs[checkbox]) {
    return new Set();
  } else {
    return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
  }
}

function getCheckboxState(checkbox, references) {
  var storedRefsSet = getStoredCheckboxRefs(checkbox);
  var currentRefsSet = new Set(references.map(r => r[1]));
  // Get difference of current - stored
  var difference = new Set(currentRefsSet);
  for (ref of storedRefsSet) {
    difference.delete(ref);
  }
  if (difference.size == 0) {
    // All the current refs are stored
    return "checked";
  } else if (difference.size == currentRefsSet.size) {
    // None of the current refs are stored
    return "unchecked";
  } else {
    // Some of the refs are stored
    return "indeterminate";
  }
}

function setBomCheckboxState(checkbox, element, references) {
  var state = getCheckboxState(checkbox, references);
  element.checked = (state == "checked");
  element.indeterminate = (state == "indeterminate");
}

function createCheckboxChangeHandler(checkbox, references, row) {
  return function () {
    refsSet = getStoredCheckboxRefs(checkbox);
    var markWhenChecked = settings.markWhenChecked == checkbox;
    eventArgs = {
      checkbox: checkbox,
      refs: references,
    }
    if (this.checked) {
      // checkbox ticked
      for (var ref of references) {
        refsSet.add(ref[1]);
      }
      if (markWhenChecked) {
        row.classList.add("checked");
        for (var ref of references) {
          markedFootprints.add(ref[1]);
        }
        drawHighlights();
      }
      eventArgs.state = 'checked';
    } else {
      // checkbox unticked
      for (var ref of references) {
        refsSet.delete(ref[1]);
      }
      if (markWhenChecked) {
        row.classList.remove("checked");
        for (var ref of references) {
          markedFootprints.delete(ref[1]);
        }
        drawHighlights();
      }
      eventArgs.state = 'unchecked';
    }
    settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
    updateCheckboxStats(checkbox);
    EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
  }
}

function clearHighlightedFootprints() {
  if (currentHighlightedRowId) {
    document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    currentHighlightedRowId = null;
    highlightedFootprints = [];
    highlightedNet = null;
  }
}

function createRowHighlightHandler(rowid, refs, net) {
  return function () {
    if (currentHighlightedRowId) {
      if (currentHighlightedRowId == rowid) {
        return;
      }
      document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    }
    document.getElementById(rowid).classList.add("highlighted");
    currentHighlightedRowId = rowid;
    highlightedFootprints = refs ? refs.map(r => r[1]) : [];
    highlightedNet = net;
    drawHighlights();
    EventHandler.emitEvent(
      IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
      rowid: rowid,
      refs: refs,
      net: net
    });
  }
}

function entryMatches(entry) {
  if (settings.bommode == "netlist") {
    // entry is just a net name
    return entry.toLowerCase().indexOf(filter) >= 0;
  }
  // check refs
  if (!settings.hiddenColumns.includes("references")) {
    for (var ref of entry) {
      if (ref[0].toLowerCase().indexOf(filter) >= 0) {
        return true;
      }
    }
  }
  // check fields
  for (var i in config.fields) {
    var f = config.fields[i];
    if (!settings.hiddenColumns.includes(f)) {
      for (var ref of entry) {
        if (pcbdata.bom.fields[ref[1]][i].toLowerCase().indexOf(filter) >= 0) {
          return true;
        }
      }
    }
  }
  return false;
}

function findRefInEntry(entry) {
  return entry.filter(r => r[0].toLowerCase() == reflookup);
}

function highlightFilter(s) {
  if (!filter) {
    return s;
  }
  var parts = s.toLowerCase().split(filter);
  if (parts.length == 1) {
    return s;
  }
  var r = "";
  var pos = 0;
  for (var i in parts) {
    if (i > 0) {
      r += '<mark class="highlight">' +
        s.substring(pos, pos + filter.length) +
        '</mark>';
      pos += filter.length;
    }
    r += s.substring(pos, pos + parts[i].length);
    pos += parts[i].length;
  }
  return r;
}

function checkboxSetUnsetAllHandler(checkboxname) {
  return function () {
    var checkboxnum = 0;
    while (checkboxnum < settings.checkboxes.length &&
      settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
      checkboxnum++;
    }
    if (checkboxnum >= settings.checkboxes.length) {
      return;
    }
    var allset = true;
    var checkbox;
    var row;
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      if (!checkbox.checked || checkbox.indeterminate) {
        allset = false;
        break;
      }
    }
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      checkbox.checked = !allset;
      checkbox.indeterminate = false;
      checkbox.onchange();
    }
  }
}

function createColumnHeader(name, cls, comparator, is_checkbox = false) {
  var th = document.createElement("TH");
  th.innerHTML = name;
  th.classList.add(cls);
  if (is_checkbox)
    th.setAttribute("col_name", "bom-checkbox");
  else
    th.setAttribute("col_name", name);
  var span = document.createElement("SPAN");
  span.classList.add("sortmark");
  span.classList.add("none");
  th.appendChild(span);
  var spacer = document.createElement("div");
  spacer.className = "column-spacer";
  th.appendChild(spacer);
  spacer.onclick = function () {
    if (currentSortColumn && th !== currentSortColumn) {
      // Currently sorted by another column
      currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
      currentSortColumn.childNodes[1].classList.add("none");
      currentSortColumn = null;
      currentSortOrder = null;
    }
    if (currentSortColumn && th === currentSortColumn) {
      // Already sorted by this column
      if (currentSortOrder == "asc") {
        // Sort by this column, descending order
        bomSortFunction = function (a, b) {
          return -comparator(a, b);
        }
        currentSortColumn.childNodes[1].classList.remove("asc");
        currentSortColumn.childNodes[1].classList.add("desc");
        currentSortOrder = "desc";
      } else {
        // Unsort
        bomSortFunction = null;
        currentSortColumn.childNodes[1].classList.remove("desc");
        currentSortColumn.childNodes[1].classList.add("none");
        currentSortColumn = null;
        currentSortOrder = null;
      }
    } else {
      // Sort by this column, ascending order
      bomSortFunction = comparator;
      currentSortColumn = th;
      currentSortColumn.childNodes[1].classList.remove("none");
      currentSortColumn.childNodes[1].classList.add("asc");
      currentSortOrder = "asc";
    }
    populateBomBody();
  }
  if (is_checkbox) {
    spacer.onclick = fancyDblClickHandler(
      spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
  }
  return th;
}

function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
  while (bomhead.firstChild) {
    bomhead.removeChild(bomhead.firstChild);
  }
  var tr = document.createElement("TR");
  var th = document.createElement("TH");
  th.classList.add("numCol");

  var vismenu = document.createElement("div");
  vismenu.id = "vismenu";
  vismenu.classList.add("menu");

  var visbutton = document.createElement("div");
  visbutton.classList.add("visbtn");
  visbutton.classList.add("hideonprint");

  var viscontent = document.createElement("div");
  viscontent.classList.add("menu-content");
  viscontent.id = "vismenu-content";

  settings.columnOrder.forEach(column => {
    if (typeof column !== "string")
      return;

    // Skip empty columns
    if (column === "checkboxes" && settings.checkboxes.length == 0)
      return;
    else if (column === "Quantity" && settings.bommode == "ungrouped")
      return;

    var label = document.createElement("label");
    label.classList.add("menu-label");

    var input = document.createElement("input");
    input.classList.add("visibility_checkbox");
    input.type = "checkbox";
    input.onchange = function (e) {
      setShowBOMColumn(column, e.target.checked)
    };
    input.checked = !(settings.hiddenColumns.includes(column));

    label.appendChild(input);
    if (column.length > 0)
      label.append(column[0].toUpperCase() + column.slice(1));

    viscontent.appendChild(label);
  });

  viscontent.childNodes[0].classList.add("menu-label-top");

  vismenu.appendChild(visbutton);
  if (settings.bommode != "netlist") {
    vismenu.appendChild(viscontent);
    th.appendChild(vismenu);
  }
  tr.appendChild(th);

  var checkboxCompareClosure = function (checkbox) {
    return (a, b) => {
      var stateA = getCheckboxState(checkbox, a);
      var stateB = getCheckboxState(checkbox, b);
      if (stateA > stateB) return -1;
      if (stateA < stateB) return 1;
      return 0;
    }
  }
  var stringFieldCompareClosure = function (fieldIndex) {
    return (a, b) => {
      var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
      var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
      if (fa != fb) return fa > fb ? 1 : -1;
      else return 0;
    }
  }
  var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
  var compareRefs = (a, b) => {
    var ra = referenceRegex.exec(a);
    var rb = referenceRegex.exec(b);
    if (ra === null || rb === null) {
      if (a != b) return a > b ? 1 : -1;
      return 0;
    } else {
      if (ra.groups.prefix != rb.groups.prefix) {
        return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
      }
      if (ra.groups.number != rb.groups.number) {
        return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
      }
      return 0;
    }
  }
  if (settings.bommode == "netlist") {
    th = createColumnHeader("Net name", "bom-netname", (a, b) => {
      if (a > b) return -1;
      if (a < b) return 1;
      return 0;
    });
    tr.appendChild(th);
  } else {
    // Filter hidden columns
    var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
    var valueIndex = config.fields.indexOf("Value");
    var footprintIndex = config.fields.indexOf("Footprint");
    columns.forEach((column) => {
      if (column === placeHolderColumn) {
        var n = 1;
        if (column === "checkboxes")
          n = settings.checkboxes.length;
        for (i = 0; i < n; i++) {
          td = placeHolderElements.shift();
          tr.appendChild(td);
        }
        return;
      } else if (column === "checkboxes") {
        for (var checkbox of settings.checkboxes) {
          th = createColumnHeader(
            checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
          tr.appendChild(th);
        }
      } else if (column === "References") {
        tr.appendChild(createColumnHeader("References", "references", (a, b) => {
          var i = 0;
          while (i < a.length && i < b.length) {
            if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
            i++;
          }
          return a.length - b.length;
        }));
      } else if (column === "Value") {
        tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
          var ra = a[0][1], rb = b[0][1];
          return valueCompare(
            pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
            pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
        }));
        return;
      } else if (column === "Footprint") {
        tr.appendChild(createColumnHeader(
          "Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
      } else if (column === "Quantity" && settings.bommode == "grouped") {
        tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
          return a.length - b.length;
        }));
      } else {
        // Other fields
        var i = config.fields.indexOf(column);
        if (i < 0)
          return;
        tr.appendChild(createColumnHeader(
          column, `field${i + 1}`, stringFieldCompareClosure(i)));
      }
    });
  }
  bomhead.appendChild(tr);
}

function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
  while (bom.firstChild) {
    bom.removeChild(bom.firstChild);
  }
  highlightHandlers = [];
  footprintIndexToHandler = {};
  netsToHandler = {};
  currentHighlightedRowId = null;
  var first = true;
  if (settings.bommode == "netlist") {
    bomtable = pcbdata.nets.slice();
  } else {
    switch (settings.canvaslayout) {
      case 'F':
        bomtable = pcbdata.bom.F.slice();
        break;
      case 'FB':
        bomtable = pcbdata.bom.both.slice();
        break;
      case 'B':
        bomtable = pcbdata.bom.B.slice();
        break;
    }
    if (settings.bommode == "ungrouped") {
      // expand bom table
      expandedTable = []
      for (var bomentry of bomtable) {
        for (var ref of bomentry) {
          expandedTable.push([ref]);
        }
      }
      bomtable = expandedTable;
    }
  }
  if (bomSortFunction) {
    bomtable = bomtable.sort(bomSortFunction);
  }
  for (var i in bomtable) {
    var bomentry = bomtable[i];
    if (filter && !entryMatches(bomentry)) {
      continue;
    }
    var references = null;
    var netname = null;
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    var rownum = +i + 1;
    tr.id = "bomrow" + rownum;
    td.textContent = rownum;
    tr.appendChild(td);
    if (settings.bommode == "netlist") {
      netname = bomentry;
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
      tr.appendChild(td);
    } else {
      if (reflookup) {
        references = findRefInEntry(bomentry);
        if (references.length == 0) {
          continue;
        }
      } else {
        references = bomentry;
      }
      // Filter hidden columns
      var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
      columns.forEach((column) => {
        if (column === placeholderColumn) {
          var n = 1;
          if (column === "checkboxes")
            n = settings.checkboxes.length;
          for (i = 0; i < n; i++) {
            td = placeHolderElements.shift();
            tr.appendChild(td);
          }
          return;
        } else if (column === "checkboxes") {
          for (var checkbox of settings.checkboxes) {
            if (checkbox) {
              td = document.createElement("TD");
              var input = document.createElement("input");
              input.type = "checkbox";
              input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
              setBomCheckboxState(checkbox, input, references);
              if (input.checked && settings.markWhenChecked == checkbox) {
                tr.classList.add("checked");
              }
              td.appendChild(input);
              tr.appendChild(td);
            }
          }
        } else if (column === "References") {
          td = document.createElement("TD");
          td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
          tr.appendChild(td);
        } else if (column === "Quantity" && settings.bommode == "grouped") {
          // Quantity
          td = document.createElement("TD");
          td.textContent = references.length;
          tr.appendChild(td);
        } else {
          // All the other fields
          var field_index = config.fields.indexOf(column)
          if (field_index < 0)
            return;
          var valueSet = new Set();
          references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
          td = document.createElement("TD");
          td.innerHTML = highlightFilter(Array.from(valueSet).join(", "));
          tr.appendChild(td);
        }
      });
    }
    bom.appendChild(tr);
    var handler = createRowHighlightHandler(tr.id, references, netname);
    tr.onmousemove = handler;
    highlightHandlers.push({
      id: tr.id,
      handler: handler,
    });
    if (references !== null) {
      for (var refIndex of references.map(r => r[1])) {
        footprintIndexToHandler[refIndex] = handler;
      }
    }
    if (netname !== null) {
      netsToHandler[netname] = handler;
    }
    if ((filter || reflookup) && first) {
      handler();
      first = false;
    }
  }
  EventHandler.emitEvent(
    IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
    filter: filter,
    reflookup: reflookup,
    checkboxes: settings.checkboxes,
    bommode: settings.bommode,
  });
}

function highlightPreviousRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[highlightHandlers.length - 1].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[0].id == currentHighlightedRowId) {
      highlightHandlers[highlightHandlers.length - 1].handler();
    } else {
      for (var i = 0; i < highlightHandlers.length - 1; i++) {
        if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function highlightNextRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[0].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
      highlightHandlers[0].handler();
    } else {
      for (var i = 1; i < highlightHandlers.length; i++) {
        if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function populateBomTable() {
  populateBomHeader();
  populateBomBody();
  setBomHandlers();
  resizableGrid(bomhead);
}

function footprintsClicked(footprintIndexes) {
  var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
  for (var i = 1; i <= footprintIndexes.length; i++) {
    var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
    if (refIndex in footprintIndexToHandler) {
      lastClicked = refIndex;
      footprintIndexToHandler[refIndex]();
      smoothScrollToRow(currentHighlightedRowId);
      break;
    }
  }
}

function netClicked(net) {
  if (net in netsToHandler) {
    netsToHandler[net]();
    smoothScrollToRow(currentHighlightedRowId);
  } else {
    clearHighlightedFootprints();
    highlightedNet = net;
    drawHighlights();
  }
}

function updateFilter(input) {
  filter = input.toLowerCase();
  populateBomTable();
}

function updateRefLookup(input) {
  reflookup = input.toLowerCase();
  populateBomTable();
}

function changeCanvasLayout(layout) {
  document.getElementById("fl-btn").classList.remove("depressed");
  document.getElementById("fb-btn").classList.remove("depressed");
  document.getElementById("bl-btn").classList.remove("depressed");
  switch (layout) {
    case 'F':
      document.getElementById("fl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(1);
      }
      break;
    case 'B':
      document.getElementById("bl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(0);
      }
      break;
    default:
      document.getElementById("fb-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.setSizes([50, 50]);
      }
  }
  settings.canvaslayout = layout;
  writeStorage("canvaslayout", layout);
  resizeAll();
  changeBomMode(settings.bommode);
}

function populateMetadata() {
  document.getElementById("title").innerHTML = pcbdata.metadata.title;
  document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  document.getElementById("company").innerHTML = pcbdata.metadata.company;
  document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  if (pcbdata.metadata.title != "") {
    document.title = pcbdata.metadata.title + " BOM";
  }
  // Calculate board stats
  var fp_f = 0,
    fp_b = 0,
    pads_f = 0,
    pads_b = 0,
    pads_th = 0;
  for (var i = 0; i < pcbdata.footprints.length; i++) {
    if (pcbdata.bom.skipped.includes(i)) continue;
    var mod = pcbdata.footprints[i];
    if (mod.layer == "F") {
      fp_f++;
    } else {
      fp_b++;
    }
    for (var pad of mod.pads) {
      if (pad.type == "th") {
        pads_th++;
      } else {
        if (pad.layers.includes("F")) {
          pads_f++;
        }
        if (pad.layers.includes("B")) {
          pads_b++;
        }
      }
    }
  }
  document.getElementById("stats-components-front").innerHTML = fp_f;
  document.getElementById("stats-components-back").innerHTML = fp_b;
  document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  document.getElementById("stats-th-pads").innerHTML = pads_th;
  // Update version string
  document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
    /^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}

function changeBomLayout(layout) {
  document.getElementById("bom-btn").classList.remove("depressed");
  document.getElementById("lr-btn").classList.remove("depressed");
  document.getElementById("tb-btn").classList.remove("depressed");
  switch (layout) {
    case 'bom-only':
      document.getElementById("bom-btn").classList.add("depressed");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      document.getElementById("frontcanvas").style.display = "none";
      document.getElementById("backcanvas").style.display = "none";
      document.getElementById("bot").style.height = "";
      break;
    case 'top-bottom':
      document.getElementById("tb-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.remove("split-horizontal");
      document.getElementById("canvasdiv").classList.remove("split-horizontal");
      document.getElementById("frontcanvas").classList.add("split-horizontal");
      document.getElementById("backcanvas").classList.add("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        direction: "vertical",
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        onDragEnd: resizeAll
      });
      break;
    case 'left-right':
      document.getElementById("lr-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.add("split-horizontal");
      document.getElementById("canvasdiv").classList.add("split-horizontal");
      document.getElementById("frontcanvas").classList.remove("split-horizontal");
      document.getElementById("backcanvas").classList.remove("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        direction: "vertical",
        onDragEnd: resizeAll
      });
  }
  settings.bomlayout = layout;
  writeStorage("bomlayout", layout);
  changeCanvasLayout(settings.canvaslayout);
}

function changeBomMode(mode) {
  document.getElementById("bom-grouped-btn").classList.remove("depressed");
  document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
  document.getElementById("bom-netlist-btn").classList.remove("depressed");
  var chkbxs = document.getElementsByClassName("visibility_checkbox");

  switch (mode) {
    case 'grouped':
      document.getElementById("bom-grouped-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = false;
      }
      break;
    case 'ungrouped':
      document.getElementById("bom-ungrouped-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = false;
      }
      break;
    case 'netlist':
      document.getElementById("bom-netlist-btn").classList.add("depressed");
      for (var i = 0; i < chkbxs.length; i++) {
        chkbxs[i].disabled = true;
      }
  }

  writeStorage("bommode", mode);
  if (mode != settings.bommode) {
    settings.bommode = mode;
    bomSortFunction = null;
    currentSortColumn = null;
    currentSortOrder = null;
    clearHighlightedFootprints();
  }
  populateBomTable();
}

function focusFilterField() {
  focusInputField(document.getElementById("filter"));
}

function focusRefLookupField() {
  focusInputField(document.getElementById("reflookup"));
}

function toggleBomCheckbox(bomrowid, checkboxnum) {
  if (!bomrowid || checkboxnum > settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
  checkbox.checked = !checkbox.checked;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function checkBomCheckbox(bomrowid, checkboxname) {
  var checkboxnum = 0;
  while (checkboxnum < settings.checkboxes.length &&
    settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
    checkboxnum++;
  }
  if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
  checkbox.checked = true;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function setBomCheckboxes(value) {
  writeStorage("bomCheckboxes", value);
  settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
  prepCheckboxes();
  populateMarkWhenCheckedOptions();
  setMarkWhenChecked(settings.markWhenChecked);
}

function setMarkWhenChecked(value) {
  writeStorage("markWhenChecked", value);
  settings.markWhenChecked = value;
  markedFootprints.clear();
  for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
    markedFootprints.add(ref);
  }
  populateBomTable();
  drawHighlights();
}

function prepCheckboxes() {
  var table = document.getElementById("checkbox-stats");
  while (table.childElementCount > 1) {
    table.removeChild(table.lastChild);
  }
  if (settings.checkboxes.length) {
    table.style.display = "";
  } else {
    table.style.display = "none";
  }
  for (var checkbox of settings.checkboxes) {
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    td.innerHTML = checkbox;
    tr.appendChild(td);
    td = document.createElement("TD");
    td.id = "checkbox-stats-" + checkbox;
    var progressbar = document.createElement("div");
    progressbar.classList.add("bar");
    td.appendChild(progressbar);
    var text = document.createElement("div");
    text.classList.add("text");
    td.appendChild(text);
    tr.appendChild(td);
    table.appendChild(tr);
    updateCheckboxStats(checkbox);
  }
}

function populateMarkWhenCheckedOptions() {
  var container = document.getElementById("markWhenCheckedContainer");

  if (settings.checkboxes.length == 0) {
    container.parentElement.style.display = "none";
    return;
  }

  container.innerHTML = '';
  container.parentElement.style.display = "inline-block";

  function createOption(name, displayName) {
    var id = "markWhenChecked-" + name;

    var div = document.createElement("div");
    div.classList.add("radio-container");

    var input = document.createElement("input");
    input.type = "radio";
    input.name = "markWhenChecked";
    input.value = name;
    input.id = id;
    input.onchange = () => setMarkWhenChecked(name);
    div.appendChild(input);

    // Preserve the selected element when the checkboxes change
    if (name == settings.markWhenChecked) {
      input.checked = true;
    }

    var label = document.createElement("label");
    label.innerHTML = displayName;
    label.htmlFor = id;
    div.appendChild(label);

    container.appendChild(div);
  }
  createOption("", "None");
  for (var checkbox of settings.checkboxes) {
    createOption(checkbox, checkbox);
  }
}

function updateCheckboxStats(checkbox) {
  var checked = getStoredCheckboxRefs(checkbox).size;
  var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
  var percent = checked * 100.0 / total;
  var td = document.getElementById("checkbox-stats-" + checkbox);
  td.firstChild.style.width = percent + "%";
  td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}

function constrain(number, min, max){
  return Math.min(Math.max(parseInt(number), min), max);
}

document.onkeydown = function (e) {
  switch (e.key) {
    case "n":
      if (document.activeElement.type == "text") {
        return;
      }
      if (currentHighlightedRowId !== null) {
        checkBomCheckbox(currentHighlightedRowId, "placed");
        highlightNextRow();
        e.preventDefault();
      }
      break;
    case "ArrowUp":
      highlightPreviousRow();
      e.preventDefault();
      break;
    case "ArrowDown":
      highlightNextRow();
      e.preventDefault();
      break;
    case "ArrowLeft":
    case "ArrowRight":
      if (document.activeElement.type != "text"){
        e.preventDefault();
        let boardRotationElement = document.getElementById("boardRotation")
        settings.boardRotation = parseInt(boardRotationElement.value);  // degrees / 5
        if (e.key == "ArrowLeft"){
            settings.boardRotation += 3;  // 15 degrees
        }
        else{
            settings.boardRotation -= 3;
        }
        settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
        boardRotationElement.value = settings.boardRotation
        setBoardRotation(settings.boardRotation);
      }
      break;      
    default:
      break;
  }
  if (e.altKey) {
    switch (e.key) {
      case "f":
        focusFilterField();
        e.preventDefault();
        break;
      case "r":
        focusRefLookupField();
        e.preventDefault();
        break;
      case "z":
        changeBomLayout("bom-only");
        e.preventDefault();
        break;
      case "x":
        changeBomLayout("left-right");
        e.preventDefault();
        break;
      case "c":
        changeBomLayout("top-bottom");
        e.preventDefault();
        break;
      case "v":
        changeCanvasLayout("F");
        e.preventDefault();
        break;
      case "b":
        changeCanvasLayout("FB");
        e.preventDefault();
        break;
      case "n":
        changeCanvasLayout("B");
        e.preventDefault();
        break;
      default:
        break;
    }
    if (e.key >= '1' && e.key <= '9') {
      toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
      e.preventDefault();
    }
  }
}

function hideNetlistButton() {
  document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
  document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
  document.getElementById("bom-netlist-btn").style.display = "none";
}

window.onload = function (e) {
  initUtils();
  initRender();
  initStorage();
  initDefaults();
  cleanGutters();
  populateMetadata();
  dbgdiv = document.getElementById("dbg");
  bom = document.getElementById("bombody");
  bomhead = document.getElementById("bomhead");
  filter = "";
  reflookup = "";
  if (!("nets" in pcbdata)) {
    hideNetlistButton();
  }
  initDone = true;
  setBomCheckboxes(document.getElementById("bomCheckboxes").value);
  // Triggers render
  changeBomLayout(settings.bomlayout);

  // Users may leave fullscreen without touching the checkbox. Uncheck.
  document.addEventListener('fullscreenchange', () => {
    if (!document.fullscreenElement)
      document.getElementById('fullscreenCheckbox').checked = false;
  });
}

window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);

///////////////////////////////////////////////

///////////////////////////////////////////////

///////////////////////////////////////////////
  </script>
</head>

<body>

<div id="topmostdiv" class="topmostdiv">
  <div id="top">
    <div style="float: right; height: 100%;">
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="menubtn"></button>
        <div class="menu-content">
          <label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
            <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
            Dark mode
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
            <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
            Full Screen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
            Fab layer
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
            Silkscreen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
            References
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
            Values
          </label>
          <div id="tracksAndZonesCheckboxes">
            <label class="menu-label" style="width: calc(50% - 18px)">
              <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
              Tracks
            </label><!-- This comment eats space! All of it!
            --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
              <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
              Zones
            </label>
          </div>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
            Pads
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
            DNP outlined
          </label>
          <label class="menu-label">
            <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
            Highlight first pin
          </label>
          <label class="menu-label">
            <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
            Continuous redraw on drag
          </label>
          <label class="menu-label">
            <span>Board rotation</span>
            <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
            <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Bom checkboxes</div>
            <input id="bomCheckboxes" class="menu-textbox" type=text
                   oninput="setBomCheckboxes(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Mark when checked</div>
            <div id="markWhenCheckedContainer"></div>
          </label>
          <label class="menu-label">
            <span class="shameless-plug">
              <span>Created using</span>
              <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
              <a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
            </span>
          </label>
        </div>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                title="Front only">F
        </button>
        <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                title="Front and Back">FB
        </button>
        <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                title="Back only">B
        </button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                title="BOM only"></button>
        <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                title="BOM left, drawings right"></button>
        <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                title="BOM top, drawings bot"></button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
                title="Grouped BOM"></button>
        <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
                title="Ungrouped BOM"></button>
        <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
                title="Netlist"></button>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="statsbtn"></button>
        <div class="menu-content">
          <table class="stats">
            <tbody>
              <tr>
                <td width="40%">Board stats</td>
                <td>Front</td>
                <td>Back</td>
                <td>Total</td>
              </tr>
              <tr>
                <td>Components</td>
                <td id="stats-components-front">~</td>
                <td id="stats-components-back">~</td>
                <td id="stats-components-total">~</td>
              </tr>
              <tr>
                <td>Groups</td>
                <td id="stats-groups-front">~</td>
                <td id="stats-groups-back">~</td>
                <td id="stats-groups-total">~</td>
              </tr>
              <tr>
                <td>SMD pads</td>
                <td id="stats-smd-pads-front">~</td>
                <td id="stats-smd-pads-back">~</td>
                <td id="stats-smd-pads-total">~</td>
              </tr>
              <tr>
                <td>TH pads</td>
                <td colspan=3 id="stats-th-pads">~</td>
              </tr>
            </tbody>
          </table>
          <table class="stats">
            <col width="40%"/><col />
            <tbody id="checkbox-stats">
              <tr>
                <td colspan=2 style="border-top: 0">Checkboxes</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="iobtn"></button>
        <div class="menu-content">
          <div class="menu-label menu-label-top">
            <div style="margin-left: 5px;">Save board image</div>
            <div class="flexbox">
              <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
              <span>X</span>
              <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
            </div>
            <label>
              <input id="render-save-transparent" type="checkbox">
              Transparent background
            </label>
            <div class="flexbox">
              <button class="savebtn" onclick="saveImage('F')">Front</button>
              <button class="savebtn" onclick="saveImage('B')">Back</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Config and checkbox state</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveSettings()">Export</button>
              <button class="savebtn" onclick="loadSettings()">Import</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Save bom table as</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveBomTable('csv')">csv</button>
              <button class="savebtn" onclick="saveBomTable('txt')">txt</button>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div id="fileinfodiv" style="overflow: auto;">
      <table class="fileinfo">
        <tbody>
          <tr>
            <td id="title" class="title" style="width: 70%">
              Title
            </td>
            <td id="revision" class="title" style="width: 30%">
              Revision
            </td>
          </tr>
          <tr>
            <td id="company">
              Company
            </td>
            <td id="filedate">
              Date
            </td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
  <div id="bot" class="split" style="height: calc(100% - 80px)">
    <div id="bomdiv" class="split split-horizontal">
      <div style="width: 100%">
        <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
               oninput="updateRefLookup(this.value)">
        <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
               oninput="updateFilter(this.value)">
        <div class="button-container hideonprint" style="float: left; margin: 0;">
          <button id="copy" title="Copy bom table to clipboard"
               onclick="saveBomTable('clipboard')"></button>
        </div>
      </div>
      <div id="dbg"></div>
      <table class="bom" id="bomtable">
        <thead id="bomhead">
        </thead>
        <tbody id="bombody">
        </tbody>
      </table>
    </div>
    <div id="canvasdiv" class="split split-horizontal">
      <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
      <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
    </div>
  </div>
</div>

</body>

</html>
